我更喜欢在ASP.NET MVC应用程序中使用jQuery而不是Microsoft Ajax库。我一直在为我的动作添加一个名为“mode”的参数,我在我的ajax调用中设置了这个参数。如果提供,我返回一个JsonViewResult。如果没有提供,我认为这是一个标准的Http帖子,我返回一个ViewResult。
我希望能够在使用jQuery时在我的控制器中使用类似于IsMvcAjaxRequest的东西,这样我就可以消除我的动作中的额外参数。
那里有什么可以在我的控制器中提供这种功能或者一些简单的方法来实现它吗?我不想疯狂编写代码,因为添加单个参数有效,它只是不理想。
答案 0 :(得分:12)
除了MVC RC1发行说明 - 2009年1月
之外IsMvcAjaxRequest重命名为IsAjaxRequest
IsMvcAjaxRequest方法 重命名为IsAjaxRequest。作为...的一部分 这个改变,是IsAjaxRequest方法 更新以识别 X-Requested-With HTTP标头。这是 一个众所周知的标题由专业发送 JavaScript库等 Prototype.js,jQuery和Dojo。
更新了ASP.NET AJAX帮助程序以发送此标头 要求。但是,他们继续 也将它发送到表格的正文中 发布以解决问题 剥离未知的防火墙 头。
换句话说 - 它被专门重命名为与其他库更“兼容”。
此外,对于没有阅读full release notes但已使用以前版本的人 - 即使是最新版本 - 我强烈建议您完整阅读。它将为您节省时间,并且很可能会激发您的一些新功能。令人惊讶的是,那里有多少新东西。
重要提示:如果从Beta升级到RC1,则需要确保升级MicrosoftAjax.MVC的.js文件(不是确切的名称) - 否则此方法将无效。它不作为升级所需的任务列在发行说明中,所以不要忘记。
答案 1 :(得分:4)
请参阅下面的Simons答案。最新版本的ASP.NET MVC中不再需要我在此描述的方法。
IsMvcAjaxRequest
扩展方法目前的工作方式是检查Request["__MVCASYNCPOST"] == "true"
,它只在该方法是HTTP POST请求时才有效。
如果您通过jQuery发出HTTP POST请求,您可以动态地将__MVCASYNCPOST
值插入到您的请求中,然后您可以利用IsMvcAjaxRequest
扩展方法。
为方便起见,这是link to the source of the IsMvcAjaxRequest extension method。
或者,您可以创建一个名为IsMvcAjaxRequest
扩展方法的克隆
IsjQueryAjaxRequest
检查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(':(');}
}
);
});
答案 2 :(得分:3)
为什么不简单地检查大多数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请求。
答案 3 :(得分:0)
好的,我已经更进一步并修改了我的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代码中添加任何特殊内容。