gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:07:51 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com