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

时间:2008-11-14 02:48:24

标签: javascript jquery asp.net-mvc ajax

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

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

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

4 个答案:

答案 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代码中添加任何特殊内容。