代码之家  ›  专栏  ›  技术社区  ›  Andrew Van Slaars

jQuery是否存在与Request.IsMvcAjaxRequest()等效的请求?

  •  8
  • Andrew Van Slaars  · 技术社区  · 17 年前

    是否有任何东西可以在我的控制器中提供这种功能,或者用一些简单的方法来实现它?我不想疯狂地编写代码,因为添加一个参数是有效的,它并不理想。

    4 回复  |  直到 17 年前
        1
  •  12
  •   Community Mohan Dere    6 年前

    这里是一个MVC RC1发行说明的例外-2009年1月

    这一更改将使用IsAjaxRequest方法 已更新以识别 由少校发送的众所周知的报头 JavaScript库,例如

    请求。然而,他们继续在努力 发布以解决问题 带未知的防火墙

    full release notes 强烈地

    如果从测试版升级到RC1,您需要确保升级MicrosoftAjax.MVC的.js文件(不是确切的名称),否则此方法将无法工作。在发行说明中未将其列为升级所需的任务,因此不要忘记。

        2
  •  4
  •   qrush    17 年前

    见下面的西蒙斯回答。我在这里描述的方法在最新版本的ASP.NET MVC中不再需要。

    道路 IsMvcAjaxRequest 扩展方法当前的工作原理是检查 Request["__MVCASYNCPOST"] == "true" ,并且仅当该方法是HTTP POST请求时才有效。

    __MVCASYNCPOST IsMvcAjaxRequest

    这是一个 link to the source of the IsMvcAjaxRequest extension method

    或者,您可以创建 调用的扩展方法 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(':(');}
            }
        );
    });
    
        3
  •  3
  •   Franck    17 年前

    当发送GET或POST请求时,它的值为“XMLHttpRequest”。

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

    通过这种方式,您可以简单地区分常规浏览器请求和Ajax请求。

        4
  •  0
  •   Andrew Van Slaars    17 年前

    好的,我已经更进一步,修改了jQuery文件,将附加参数加载到post数据中,这样我就不必在每次调用post时都重复“\uuu 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的调用。现在,spoon16响应中解释的帮助器可以工作,而无需向我的页面级jQuery代码添加任何特殊内容。