我想发送一个带有嵌套数组的复杂对象在 URI 中到 GET 请求中的 MVC 操作方法。
考虑以下代码:
public ActionResult AutoCompleteHandler([FromUri]PartsQuery partsQuery){ ... }
public class PartsQuery
{
public Part[] Parts {get; set; }
public string LastKey { get; set; }
public string Term { get; set; }
}
$.ajax({
url: "Controller/AutoCompleteHandler",
data: $.param({
Parts: [{ hasLabel: "label", hasType: "type", hasIndex : 1 }],
LastKey : "Last Key",
Term : "Term"
}),
dataType: "json",
success: function(jsonData) { ... }
});
这工作得很好,并且使用默认模型绑定器正确绑定在 MVC Web Api 中.
但是,将其切换为普通 MVC 而不是 WebApi,默认模型绑定器将崩溃并且无法绑定嵌套数组中对象的属性:
观察名单
partsQuery != null //Good
--LastKey == "Last Key" //Good
--Term == "Term" //Good
--Parts[] != null //Good
----hasLabel == null //Failed to bind
----hasType == null //Failed to bind
----hasIndex == 0 //Failed to bind
我想知道为什么这会在普通的 MVC 中崩溃以及如何制作FromUriAttribute
在普通 MVC 中正确绑定此对象
这里的核心问题是 MVC 和 WebApi 使用不同的模型绑定器。甚至基本接口也不同。
Mvc - System.Web.Mvc.IModelBinder
Web API - System.Web.Http.ModelBinding.IModelBinder
当您使用 $.ajax 调用发送数据时,您将发送以下查询字符串参数:
Parts[0][hasLabel]:label
Parts[0][hasType]:type
Parts[0][hasIndex]:1
LastKey:Last Key
Term:Term
然而,与 MVC 默认模型绑定器绑定的正确格式对于参数名称具有不同的命名约定:
Parts[0].hasLabel:label
Parts[0].hasType:type
Parts[0].hasIndex:1
LastKey:Last Key
Term:Term
所以,这个方法调用可以工作:
$.ajax({
url: "Controller/AutoCompleteHandler?Parts[0].hasLabel=label&Parts[0].hasType=type&Parts[0].hasIndex=1&LastKey=Last+Key&Term=Term",
dataType: "json",
success: function(jsonData) { ... }
});
您需要构建符合 MVC 模型绑定器命名约定的查询字符串。
此外[FromUri]
示例操作中的属性被完全忽略,因为 MVC DefaultModelBinder 不知道它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)