[英]ASP.NET MVC Model binding doesn't work with AJAX GET but works with Post
我使用Jquery AJAX作为GET请求时遇到问题。 由于某种原因,ASP.NET MVC模型绑定器似乎无法绑定到我的过滤器项。 调用操作结果会发生什么,但会创建一个空对象。
但是,如果我从HTTP Get更改为HTTP Post,那么它可以工作。 那为什么会这样? 根据我的理解,最好使用GET,因为服务器上的数据没有变化。
这是我的代码的精简版:
AJAX:
$.ajax({
url: url,
contentType: 'application/json',
dataType: 'json',
type: "GET",
data: "{'filter':" + ko.toJSON(model.filter) + "}",
error: function (xhr, textStatus, errorThrown) {
},
success: function (returnedData) {
}
的ActionResult:
[HttpGet]
public virtual ActionResult Index(IFilter filter)
{
ViewModel filteredViewModel = GetFilteredViewModel(filter);
if (Request.IsAjaxRequest())
{
return toJSON(filteredViewModel );
}
return View(filteredViewModel );
}
过滤:
public class Filter: IFilter
{
public Nullable<DateTime> LogDate { get; set; }
public Nullable<int> SpecificItem_ID { get; set; }
}
首先,为了解决误解,POST并不一定意味着改变 。 由于缺少更好的单词,在访问“功能”时通过POST请求是完全有效的。 例如:
# Request
POST /add-xy
{ "x": 2, "y": 2 }
# Response
200 OK
4
没有任何“改变”,但POST仍然是最合适的HTTP动词。
也就是说,GET和POST请求之间存在根本区别,即POST“body”的概念。 POST主体可以具有内容类型,因此可以在服务器端正确解释为JSON,XML等。使用GET,您只需要一个查询字符串,它只是一个字符串。
您遇到的问题是,使用GET时,过滤器“object”只是一个字符串,并且由于字符串不实现IFilter
因此模型绑定器无法绑定它。 但是,通过POST,过滤器“对象”将在POST正文中以适当的内容类型发送。 因此,modelbinder将其作为JSON接收,并将JSON对象映射到IFilter
的实现。
道德观点是,GET仅适用于简单的请求 - 数据几乎只是简单类型的名称 - 值对。 如果需要传输实际对象,则需要使用POST。
我不知道为什么会被接受,但目前接受的答案是完全错误的。
如果对象名称是精确filter
则ModelBinder不会绑定已发送的参数。 因此,更改对象的名称,它将正确绑定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.