asp.net-mvc - ASP.NET MVC 模型绑定(bind)不适用于 AJAX GET,但适用于 Post

标签 asp.net-mvc jquery http-get

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

但是,如果我从 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) {

    }

操作结果:

[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“主体”的概念。 POST 正文可以具有内容类型,因此可以在服务器端正确解释为 JSON、XML 等。使用 GET,您拥有的只是一个查询字符串,它只是一个字符串。

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

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

关于asp.net-mvc - ASP.NET MVC 模型绑定(bind)不适用于 AJAX GET,但适用于 Post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18128798/

相关文章:

c# - 上传用户个人资料照片 - 指南

asp.net-mvc - context.SaveChanges 不起作用

jquery - 这怎么办?如果复选框被禁用并选中,则应始终禁用它

javascript - 无法将动态添加的文本区域呈现为 TinyMCE 4.1.8

javascript - 在可拖动的 div 中设置正确的位置

android - 如何在 android 中为 HttpGet 请求添加 NameValuePairs

java - 用java向Binance交易所发送HttpGet请求报错

java - HTTP Get 语句以 URL 中的 { 结束

asp.net-mvc - 请推荐为 MVC 网格实现内联编辑的方法?

javascript - 如何将 Perfidies(浏览器插件漏洞扫描程序)集成到我的网站中?