[英]HTTP POST request body not binding in ASP .NET MVC
我是 ASP.NET MVC 的初学者。 我生成了一个基本的 class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyPluginProject.Models;
namespace MyPluginProject.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
[HttpPost]
public JsonResult data(TestRequestObject testRequestObject)
{
TestResponseObject respobj = new TestResponseObject();
respobj.id = testRequestObject.Id;
respobj.name = testRequestObject.Name;
//return Newtonsoft.Json.JsonConvert.SerializeObject(respobj);
return Json(respobj);
}
}
}
TestRequestObject
POCO 如下所示:
public class TestRequestObject
{
public string Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
路由配置:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
但是,当我在本地运行它并从 Postman 发送请求时
curl --location --request POST 'http://localhost:50132/home/data' \
--header 'Content-Type: application/json' \
--data-raw '{
"id": "123456789",
"name": "John Smith",
"address":"ftyrhrrhrhhr"
}'
该值未绑定到TestRequestObject
。 我试过[FromBody]
,但它似乎只允许用于 .NET 核心。 我似乎不明白这里出了什么问题。
更新:-
我在我创建的新 MVC C# class 中尝试了这个,并且相同的绑定设置完美无缺。正如我所说,它也在我的项目中工作,但玩弄时的一些变化弄乱了一些内部绑定的东西。我不知道是什么。任何遇到过此类问题的人都可以指导我吗?
尝试以这种方式发送 POST 请求。
curl -d '{json}' -H 'Content-Type: application/json' https://example.com/login
首先,您应该在 controller class 上使用 [Route("api/[controller]/[action]")] 标记,以便将 ZE6B391A8D2C4D45902A23A8B6585703
[Route("api/[controller]/[action]")]
public class HomeController : Controller
{
...
其次,您是 asp 的初学者,我建议您使用 Swagger 生成更好的 ui 并帮助您以正确的格式向 Webapplication 发送 HTTP 请求,以便将 swagger 添加到您的项目中,如下所示:
尝试使用 /x-www-form-urlencoded 内容类型
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'id=123456789' \
--data-urlencode 'name=John Smith'
如果仍然无法正常工作,请添加 [FromForm] 属性。 如果你想为 mvc5 使用 json 你将不得不编写大量代码来制作一个特殊的描述符
就我而言,最后我不得不写一个 model 绑定来解决这个问题
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using MyPluginProject.Models;
using Newtonsoft.Json;
namespace MyPluginProject.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
[HttpPost]
public JsonResult Data([ModelBinder(typeof(JsonNetModelBinder))] TestRequestObject testRequestObject)
{
TestResponseObject respobj = new TestResponseObject();
respobj.id = testRequestObject.Id;
respobj.name = testRequestObject.Name;
//return Newtonsoft.Json.JsonConvert.SerializeObject(respobj);
return Json(respobj);
}
}
internal class JsonNetModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
controllerContext.HttpContext.Request.InputStream.Position = 0;
var stream = controllerContext.RequestContext.HttpContext.Request.InputStream;
var readStream = new StreamReader(stream, Encoding.UTF8);
var json = readStream.ReadToEnd();
return JsonConvert.DeserializeObject(json, bindingContext.ModelType);
}
}
}
有了这个,我能够从 postman 获取请求正文绑定到 model
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.