ASP.NET MVC模型绑定不适用于AJAX GET,但适用于Post

Chr*_*ill 3 asp.net-mvc jquery http-get

我使用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) {

    }
Run Code Online (Sandbox Code Playgroud)

的ActionResult:

[HttpGet]
public virtual ActionResult Index(IFilter filter)
{
    ViewModel filteredViewModel = GetFilteredViewModel(filter);

    if (Request.IsAjaxRequest())
    {
        return toJSON(filteredViewModel );
    }

    return View(filteredViewModel );
}
Run Code Online (Sandbox Code Playgroud)

过滤:

public class Filter: IFilter 
{    
   public Nullable<DateTime> LogDate { get; set; }        
   public Nullable<int> SpecificItem_ID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 5

首先,为了解决误解,POST并不一定意味着改变.由于缺少更好的单词,在访问"功能"时通过POST请求是完全有效的.例如:

# Request
POST /add-xy
{ "x": 2, "y": 2 }

# Response
200 OK
4
Run Code Online (Sandbox Code Playgroud)

没有任何"改变",但POST仍然是最合适的HTTP动词.

也就是说,GET和POST请求之间存在根本区别,即POST"正文"的概念.POST主体可以具有内容类型,因此可以在服务器端正确解释为JSON,XML等.使用GET,您只需要一个查询字符串,它只是一个字符串.

您遇到的问题是,使用GET,过滤器"object"只是一个字符串,并且由于字符串未实现,IFilter因此模型绑定器无法绑定它.但是,通过POST,过滤器"对象"将在POST正文中以适当的内容类型发送.因此,modelbinder将其作为JSON接收,并将JSON对象映射到的实现IFilter.

道德观点是,GET仅适用于简单的请求 - 数据几乎只是简单类型的名称 - 值对.如果需要传输实际对象,则需要使用POST.