是否有一个与jQuery相同的Request.IsMvcAjaxRequest()?

我更喜欢使用jQuery和我的ASP.NET MVC应用程序而不是Microsoft Ajax库。 我一直在为我的动作添加一个名为“mode”的参数,我在我的ajax调用中设置了这个参数。 如果提供,我返回一个JsonViewResult。 如果它没有提供,我认为它是一个标准的Httppost,我返回一个ViewResult。

我希望能够在使用jQuery时在我的控制器中使用类似于IsMvcAjaxRequest的东西,这样我就可以消除我的Actions中的额外参数。

有没有什么可以在我的控制器中提供这种function或一些简单的方法来实现它? 我不想疯狂编写代码,因为添加单个参数有效,它只是不理想。

这是除了MVC RC1发行说明 – 2009年1月

IsMvcAjaxRequest重命名为IsAjaxRequest

IsMvcAjaxRequest方法已重命名为IsAjaxRequest。 作为此更改的一部分,更新了IsAjaxRequest方法以识别X-Requested-With HTTP标头。 这是由Prototype.js,jQuery和Dojo等主要JavaScript库发送的众所周知的标头。

更新了ASP.NET AJAX帮助程序以在请求中发送此标头。 但是,他们还会继续将其发送到表单post的正文中,以解决阻止未知标题的防火墙问题。

换句话说 – 它被专门重命名为与其他库更“兼容”。

此外,对于那些没有阅读完整版本说明但已使用以前版本的人 – 即使是最新版本 – 我强烈建议您完整阅读。 这将节省您将来的时间,并且很可能会激发您的一些新function。 令人惊讶的是,那里有多少新东西。

重要说明:如果从Beta升级到RC1,则需要确保升级MicrosoftAjax.MVC的.js文件(不是确切的名称) – 否则此方法将无效。 它不作为升级所需的任务列在发行说明中,所以不要忘记。

请参阅下面的西蒙斯答案。 最新版本的ASP.NET MVC中不再需要我在此描述的方法。

IsMvcAjaxRequest扩展方法当前的工作方式是它检查Request["__MVCASYNCPOST"] == "true" ,它只在该方法是HTTP POST请求时才有效。

如果您通过jQuery发出HTTP POST请求,您可以动态地将__MVCASYNCPOST值插入到您的请求中,然后您可以利用IsMvcAjaxRequest扩展方法。

为方便起见,这里是指向IsMvcAjaxRequest扩展方法源的链接 。

或者,您可以创建名为IsjQueryAjaxRequestIsMvcAjaxRequest扩展方法的克隆,该方法检查Request["__JQUERYASYNCPOST"] == "true" ,您可以将该值动态插入HTTP POST。

更新

我决定继续这样做,这是我想出的。

扩展方法

 public static class HttpRequestBaseExtensions { public static bool IsjQueryAjaxRequest(this HttpRequestBase request) { if (request == null) throw new ArgumentNullException("request"); return request["__JQUERYASYNCPOST"] == "true"; } } 

如果方法是jQuery $ .ajax()请求,则从操作中检查:

 if (Request.IsjQueryAjaxRequest()) //some code here 

JavaScript的

 $('form input[type=submit]').click(function(evt) { //intercept submit button and use AJAX instead evt.preventDefault(); $.ajax( { type: "POST", url: "<%= Url.Action("Create") %>", dataType: "json", data: { "__JQUERYASYNCPOST": "true" }, success: function(data) {alert(':)');}, error: function(res, textStatus, errorThrown) {alert(':(');} } ); }); 

为什么不简单地检查大多数Javascript库(如jQuery)自动发送的“X-Requested-With”HTTP头?

发送GET或POST请求时,它具有值“XMLHttpRequest”。

为了测试它,您只需要在操作中检查“Request.Headers”NameValueCollection,即:

 if (Request.Headers["X-Requested-With"] == "XMLHttpRequest") return Json(...); else return View(); 

这样,您可以简单地区分常规浏览器请求和Ajax请求。

好的,我已经更进了一步并修改了我的jQuery文件以将附加参数加载到post数据中,所以我不必为每次发布的调用重复“__JQUERYASYNCPOST:true”。 对于任何感兴趣的人,这是我对$ .post的新定义:

 post: function(url, data, callback, type) { var postIdentifier = {}; if (jQuery.isFunction(data)) { callback = data; data = {}; } else { postIdentifier = { __JQUERYASYNCPOST: true }; jQuery.extend(data, postIdentifier); } return jQuery.ajax({ type: "POST", url: url, data: data, success: callback, dataType: type }); } 

我添加了“postIdentifier”变量以及对jQuery.extend的调用。 现在helper在spoon16的响应中解释了,而不必在页面级jQuery代码中添加任何特殊内容。