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

时间:2013-08-08 14:34:19

标签: 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) {

    }

的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; }
}

2 个答案:

答案 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不会绑定已发送的参数。因此,更改对象的名称,它将正确绑定。