繁体   English   中英

HTTP POST 请求主体未在 ASP 中绑定 .NET MVC

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM