Post javascript对象与嵌套属性到MVC

Post javascript object with nested properties to MVC

本文关键字:属性 MVC 嵌套 javascript 对象 Post      更新时间:2023-09-26

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

public class Request
{
  string LookupName { get; set; }
  PageData PageData { get; set; }
}
public class PageData
{
  int Page { get; set; }
  int PageSize { get; set; }
}

动作方法看起来像这样:

[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',那么它将在控制器上为空。

这似乎有点奇怪,因为很明显MVC认识到有一些PageData的信息,但似乎没有实际分配属性。是否有什么我做错了,或者有一种方法,我可以找到/使用自定义模型粘合剂来获得此工作?

注意:
请注意,这里没有提到JSON。我知道我可以转换大量的代码+使用JSON等。除非这是唯一可能的选择,否则我不想在这个时候解决这个问题。

看一下Request $。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处理器来拦截你的传入流量,然后你的控制器来处理它。

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