【问题标题】:Post javascript object with nested properties to MVC将具有嵌套属性的 javascript 对象发布到 MVC
【发布时间】:2014-06-03 15:30:40
【问题描述】:

我的应用程序中定义了一个对象,如下所示:

public class Request
{
  string LookupName { get; set; }
  PageData PageData { get; set; }
}

public class PageData
{
  int Page { get; set; }
  int PageSize { get; set; }
}

action 方法如下所示:

[HttpPost]
public ActionMethod DoLookup(Request req)
{
  ...
  ...
  return new ContentResult(...);
}

我正在尝试使用 JQuery + Javascript 将信息发布到操作中,除了嵌套属性之外,一切都运行良好:

// javascript...
var reqData = {};
reqData.LookupName = "abc";
reqData.PageData= { Page:1, PageSize:10 };

$.post("/Controller/DoLookup", reqData, function(data) {
 ...
});

这很好用,除了“PageData”中的嵌套属性外,所有内容都可以正常发布到控制器。 Request 中的 PageData 实例似乎只是一个默认实例,因为 Page 和 PageSize 属性都是 0。如果我在 javascript 中省略了“PageData”,那么它在控制器上将为 null。

这似乎有点奇怪,因为显然 MVC 识别出 PageData 的一些信息,但似乎没有实际分配属性。是不是我做错了什么,或者有什么方法可以找到/使用自定义模型绑定器来使其正常工作?

注意:
请注意这里没有提到 JSON。我知道我可以转换大量代码 + 使用 JSON 等。这是我目前不想解决的路径,除非这是唯一可能的选择。

【问题讨论】:

  • 你有什么理由使用 JS 提交表单而不是提交按钮?
  • 在javascript中,你设置req.PageRequest,但是c#中的属性名称是PageData
  • @JasonP 哎呀,这是一个错字。我修好了。
  • 这个question可以帮助你
  • 不确定该语法是否正确,我认为应该是reqData.PageData= { "Page":1, "PageSize":10 }; - 注意双引号

标签: c# javascript jquery asp.net-mvc-4


【解决方案1】:

查看 $.post 使用 fiddler、wireshark 等为您整理的请求。您的帖子正文将类似于

LookupName=abc&PageData%5BPage%5D=1&PageData%5BPageSize%5D=10

好像它被包裹在 Stringify 中一样,服务器接收到这个

{"LookupName":"abc","PageData":{"Page":1,"PageSize":10}}

这里有趣/令人沮丧的是,asp.net MVC 在这两种情况下都会尝试将传入的数据反序列化到您的复杂对象中。但在第一种情况下,它对子复杂对象一无所知/失败。

我对购物车对象也有同样的问题。 MVC 仍然可以很好地获取主对象的属性,但我的子数组/对象为空。

如果您想保持前端代码不变,那么您需要在后端编写自定义反序列化器。这似乎很快就会变得一团糟。作为一个有趣的实验,将您的终点更改为只接收一个字符串,然后看看您最终会得到什么。

您还可以编写一个 Web 处理程序来在您的控制器自己处理之前拦截传入的流量。

【讨论】:

  • 这里令人沮丧的事情是,我确定你想在这里“这就是 .net mvc 反序列化器的内部发生的事情,以及为什么它理解 json 而不是传统的表单数据” .我已经对此进行了多次搜索,但似乎只能找到试图覆盖它的人。
  • 是的,我在反汇编中挖掘了一下,发现这只是 MVC 的另一个缺点。无论如何,我已经回退到使用将反序列化 json 数据的操作过滤器。
【解决方案2】:

您需要创建复杂的 ViewModel。必须在构造函数中创建实例。这是答案的链接。 Mvc Complex ViewModel

【讨论】:

  • 我认为这无关。此外,它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2020-07-13
  • 2019-04-23
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
相关资源
最近更新 更多