Post javascript对象与嵌套属性到MVC
本文关键字:属性 MVC 嵌套 javascript 对象 Post | 更新日期: 2023-09-27 18:06:21
我在应用程序中定义了一个对象,如下所示:
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。必须在构造函数中创建实例。这里是答案的链接。