我在使用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; }
}
答案 0 :(得分:5)
首先,为了清除误解,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。
答案 1 :(得分:-1)
我不知道为什么会被接受,但目前接受的答案是完全错误的。
如果对象名称正好是filter
,则ModelBinder不会绑定已发送的参数。因此,更改对象的名称,它将正确绑定。