Request.IsAjaxRequest 在 MVC3 中永远不会返回 true

Posted

技术标签:

【中文标题】Request.IsAjaxRequest 在 MVC3 中永远不会返回 true【英文标题】:Request.IsAjaxRequest never returns true in MVC3 【发布时间】:2012-03-25 07:35:44 【问题描述】:

我正在使用 Asp.net MVC3 并尝试向服务器发送一个简单的 Ajax 帖子,该服务器返回部分视图并在搜索期间更新我的项目列表。

    @using (Ajax.BeginForm("PartialUpdate", "Listing"
        , new  AjaxOptions  
                UpdateTargetId = "ListPartialDiv",
                HttpMethod = "GET",
                InsertionMode = InsertionMode.Replace,

        ))
    
        <!-- Search Boxes and buttons here -->
    

    <div id = "ListPartialDiv">
        @
            html.RenderPartial("_ListPartial", Model);
         
    </div>

ajax 成功调用服务器,服务器通过发送部分视图进行响应。但是局部视图总是在新页面中呈现。我发现这是因为它不知道这是一个 ajax 调用,所以它呈现了一个新页面。我已经包含了正确的 jquery-ubobtrusive-ajax.min.js 脚本,并根据This Question

添加了如下密钥
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"> 

我的控制器代码很简单:

      if (Request.IsAjaxRequest())
          return PartialView("_ListPartial", list);

      return View("Index", list);

但是 Request.IsAjaxRequest() 无论如何总是返回 false。 我还根据This Question 使用了提琴手和萤火虫,没有看到 X-Requested-With 标头,但我真的不知道这意味着什么或如何更改它。我唯一能想到的是,我看到的所有其他示例都使用旧版本的 jquery。这有什么关系吗?谢谢你的帮助。

【问题讨论】:

您是否注意到浏览器实际上并未执行 AJAX POST? 【参考方案1】:

你在 jQuery 之前包含了 unobtrusive-AJAX 脚本,所以你的脚本都不起作用。

【讨论】:

是的,正要输入相同的答案【参考方案2】:
var controllerContext = MockRepository.GenerateMock<ControllerContext>();
controllerContext.Expect(c => c.HttpContext.Request["X-Requested-With"]).Return("XMLHttpRequest");
controller.ControllerContext = controllerContext;

【讨论】:

【参考方案3】:

确保 jquery.unobtrusive.ajax.js / jquery.unobtrusive.ajax.min.js 脚本文件在其他 jquery 脚本文件之后被引用,同时确保每页引用该文件不超过一次,并且你应该被排序

【讨论】:

【参考方案4】:

你需要像这样在 jquery 脚本之后添加不显眼的脚本。

bundles.Add(new ScriptBundle("~/bundles/searchDemo").Include(
                "~/Scripts/jquery-version.js",
                "~/Scripts/jquery-ui-version.js",
                "~/Scripts/jquery.unobtrusive*",
                "~/Scripts/jquery.validate*"));

【讨论】:

【参考方案5】:

我偶然发现了 IsAjaxRequest() 不起作用的类似情况。 我确保包含 Microsoft 不显眼的软件包。它仍然没有帮助。 刚刚从包管理器升级到最新版本的不显眼的库,它就可以工作了!

【讨论】:

以上是关于Request.IsAjaxRequest 在 MVC3 中永远不会返回 true的主要内容,如果未能解决你的问题,请参考以下文章

c# – Asp.Net Core MVC中Request.IsAjaxRequest()在哪里?

通过 ActionLink 提交 Ajax.BeginForm

如何在 ASP.Net MVC 中模拟控制器上的请求?

判断请求是浏览器页面请求还是ajax进入

C# asp.net mvc 判断代码是submit提交的还是异步提交的,如果是submit提交的,获取他是post 还是get方式

如何在 M:M 中强制执行 1:M 关系?