【问题标题】:Cannot bind JSON to ASP.NET Model in multi part post无法在多部分帖子中将 JSON 绑定到 ASP.NET 模型
【发布时间】:2013-10-24 22:06:33
【问题描述】:

我正在使用 ASP.NET MVC3 控制器从 WP7 应用程序接收多部分表单帖子。帖子的格式如下:

    {User Agent stuff}
    Content-Type: multipart/form-data; boundary=8cdb3c15d07d36a

    --8cdb3c15d07d36a
    Content-Disposition: form-data; name="user"
    Content-Type: application/json

    {"UserName":"ashish","Password":"ashish"}

    --8cdb3c15d07d36a--

我的控制器看起来像:

    public class User
    {
        public string UserName { get; set;}
        public string Password { get; set; }
    }

    [HttpPost]
    public JsonResult CreateFeed(User user)
    {
    }

我看到的是 User 没有绑​​定到 json 并且用户对象始终为空。我尝试制作用户字符串并使用 DataContractJsonSerializer 手动将其绑定到 User 类,它确实创建并分配了一个对象,但我对它为什么不起作用感到困惑。

我尝试使用非多格式帖子,发现它适用于相同的 json。任何帮助,将不胜感激。

我在编写代码时看到了这些帖子:ASP.NET MVC. How to create Action method that accepts and multipart/form-data 和 HTTP 规范 http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

【问题讨论】:

  • 未经测试,即兴回答:将 name="feedItem" 更改为 name="user" ?
  • 其实我以前是用户。仍然没有运气:(
  • 您不需要顶级“用户”元素吗?您通常使用 DataContractJsonSerializer,但不确定这里发生了什么。我的意思是 { "user" : { "UserName" ... } }

标签: asp.net-mvc json binding controller


【解决方案1】:

你要找的答案是here

您必须将其作为字符串读入并在内部进行解析。 所以你的动作应该是这样的:

[HttpPost]
public JsonResult CreateFeed(string jsonResponse)
{
    JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
    User user = jsonSerializer.Deserialize<User>(jsonResponse);
}

或者,如果您没有很好用的 Content-Disposition 以及与控制器操作方法相关联的名称,您可以执行以下操作:

[HttpPost]
public JsonResult CreateFeed()
{
    StreamReader reader = new StreamReader(Request.InputStream);
    string jsonResponse = reader.ReadToEnd();

    JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
    User user = jsonSerializer.Deserialize<User>(jsonResponse);
}

进一步概述了这种方法here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多