3

我在使用 Jquery AJAX 作为 GET 请求时遇到问题。由于某种原因,ASP.NET MVC 模型绑定器似乎无法绑定到我的过滤器项。发生的情况是调用了操作结果,但创建了一个空对象。

但是,如果我从 HTTP Get 更改为 HTTP Post,那么它可以工作。为什么会这样?据我了解,使用 GET 会更好,因为服务器上没有数据发生变化。

这是我的代码的精简版本:

阿贾克斯:

$.ajax({
    url: url,
    contentType: 'application/json',
    dataType: 'json',            
    type: "GET",
    data: "{'filter':" + ko.toJSON(model.filter) + "}",
    error: function (xhr, textStatus, errorThrown) {

    },
    success: function (returnedData) {

    }

行动结果:

[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; }
}
4

2 回答 2

5

首先,为了澄清误解, POST 不一定意味着change。在访问“函数”时通过 POST 请求是完全有效的,因为没有更好的词。例如:

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

# Response
200 OK
4

什么都没有“改变”,但 POST 仍然是最合适的 HTTP 动词。

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

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

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

于 2013-08-08T19:27:24.807 回答
-1

我不知道它为什么被接受,但目前接受的答案是完全错误的。

如果您的对象名称是精确的,则 ModelBinders 不会绑定发送的参数filter。所以更改对象的名称,它将正确绑定。

于 2016-04-06T11:38:59.153 回答