Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC模型绑定不';不能使用AJAX GET,但可以使用Post_Asp.net Mvc_Jquery_Http Get - Fatal编程技术网

Asp.net mvc ASP.NET MVC模型绑定不';不能使用AJAX GET,但可以使用Post

Asp.net mvc ASP.NET MVC模型绑定不';不能使用AJAX GET,但可以使用Post,asp.net-mvc,jquery,http-get,Asp.net Mvc,Jquery,Http Get,我在使用jQueryAjax作为GET请求时遇到问题。 由于某些原因,ASP.NET MVC模型绑定器似乎无法绑定到我的筛选项。所发生的是调用了动作结果,但创建了一个空对象 但是,如果我从HTTPGET更改为HTTPPOST,那么它就可以工作了。 为什么会这样? 据我所知,最好使用GET,因为服务器上的数据没有变化 以下是我的代码的精简版本: 阿贾克斯: 行动结果: [HttpGet] public virtual ActionResult Index(IFilter filter) {

我在使用jQueryAjax作为GET请求时遇到问题。 由于某些原因,ASP.NET MVC模型绑定器似乎无法绑定到我的筛选项。所发生的是调用了动作结果,但创建了一个空对象

但是,如果我从HTTPGET更改为HTTPPOST,那么它就可以工作了。 为什么会这样? 据我所知,最好使用GET,因为服务器上的数据没有变化

以下是我的代码的精简版本:

阿贾克斯:

行动结果:

[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; }
}
公共类筛选器:IFilter
{    
公共可为空的日志日期{get;set;}
公共可空的SpecificItem_ID{get;set;}
}

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

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

# Response
200 OK
4
没有什么“改变”,但POST仍然是最合适的HTTP动词

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

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


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

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


如果对象名称正好是
filter
,则ModelBinder不会绑定发送的参数。因此,更改对象的名称,它将正确绑定

这是因为
GET
对发布
路线参数(查询字符串)
有一些限制
GET
无法发布复杂的参数。您可以发布toJSON方法的代码吗?抱歉,我不能发布,因为这只是KnockoutJS的toJSON函数,但是我可以向您展示它正在创建的JSON类型:{“logDate”:“01/08/2013”,“specificItem_ID”:null“}您尝试过
data:ko.toJSON(model.filter)吗
相反。我认为这可能有效。至少对于这个简单的案例,我认为应该有效。Aaraon我刚刚尝试过这个,但不幸的是,没有什么不同
# Request
POST /add-xy
{ "x": 2, "y": 2 }

# Response
200 OK
4