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)
首先,为了解决误解,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.
| 归档时间: |
|
| 查看次数: |
2137 次 |
| 最近记录: |