当使用jQuery时,我想能够在我的控制器中使用类似于IsMvcAjaxRequest的东西,这样我就可以消除我的Actions中的额外参数。
是否有任何东西可以在我的控制器中提供这种功能或者有一些简单的方法来完成它?我不想写太多代码,因为添加一个单独的参数是有效的,但并不理想。
以下是MVC RC1的发布说明 - 2009年1月摘录
IsMvcAjaxRequest已更名为IsAjaxRequest
IsMvcAjaxRequest方法已更名为IsAjaxRequest。作为此更改的一部分,IsAjaxRequest方法已更新以识别X-Requested-With HTTP头。这是由各种JavaScript库发送的众所周知的标头,例如Prototype.js、jQuery和Dojo。
ASP.NET AJAX助手已更新为在请求中发送此标头。但是,它们继续将其发送到表单提交的正文中,以解决防火墙剥离未知标头的问题。
换句话说,它被特意重命名以更与其他库兼容。
另外,对于那些没有阅读完整的发布说明但仍在使用以前版本(甚至是Beta)的人们,我强烈建议您仔细阅读它们。这将为您节省时间,并且很可能会让您对一些新功能感到兴奋。里面有很多新东西,相当惊人。
重要提示:如果从Beta升级到RC1,则需要确保升级MicrosoftAjax.MVC(不是确切的名称)的.js文件-否则此方法将不起作用。它未在发布说明中列为升级所需的任务,因此不要忘记进行更新。
IsMvcAjaxRequest
扩展方法的工作方式是检查Request["__MVCASYNCPOST"] == "true"
,并且仅在方法为HTTP POST请求时起作用。__MVCASYNCPOST
值到您的请求中,然后您就可以利用IsMvcAjaxRequest
扩展方法。IsjQueryAjaxRequest
的IsMvcAjaxRequest
扩展方法副本,它检查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();
好的,我已经更进一步地修改了我的jQuery文件,将附加参数加载到POST数据中,这样我就不必在每次调用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的调用。现在,在不需要添加任何特殊内容到我的页面级别的jQuery代码的情况下,spoon16回答中解释的Helper可以正常工作。