Request.IsAjaxRequest()总是在MVC4中返回false,尝试了SO中的所有建议等

时间:2014-03-04 15:22:15

标签: jquery ajax asp.net-mvc asp.net-mvc-4 razor

首先让我解释一下我尝试过的所有可能的解决方案。我现在在我的脚本文件夹中有jquery-unobtrusive-ajax.min.js并将其添加到一个包中。我已尝试在视图页面本身引用它,同时还有_Layout.cshtml页面,这就是我目前拥有该包的方式:

//BundleConfig.cs
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
            "~/Scripts/jquery-1.10.2.min.js",
            "~/Scripts/modernizr-2.6.2.js",
            "~/Scripts/jquery.validate.min.js",
            "~/Scripts/jquery.unobtrusive-ajax.min.js"));

在主布局视图页面中引用此包,其他所有视图都来自:

//_Layout.cshtml (at bottom of view, right before hitting </body></html>)
@Scripts.Render("~/bundles/jquery")

最后在web.config中,我已将这些键添加到应用程序设置中:

//Web.config
<appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

现在已经说明了,这就是我的Ajax调用的样子。我试图从一个独立的页面返回一些数据并将其替换为主页面中的内容,我认为相当简单:

@Ajax.ActionLink("Edit", "Index", "WeeklyTarget",
    new {id = item.WeeklyTargetId},
    new AjaxOptions {HttpMethod = "GET", UpdateTargetId = "hoursEdit", InsertionMode = InsertionMode.Replace})

当从索引视图中单击此操作链接时,将从控制器调用此参数:

public ActionResult Index(int? id, IEnumerable<WeeklyTarget> selection )
{            
    if (Request.IsAjaxRequest())
    {
    // return the partial view here
    }
}

但正如我的标题中所述,Request.IsAjaxRequest()仍将始终返回false。是什么赋予了???请帮忙......我已经筋疲力尽了所有的想法,调整和解决方法。我甚至尝试清理我的缓存,清洁解决方案等。

3 个答案:

答案 0 :(得分:10)

所以......问题是jquery-unobtrusive-ajax.min.js引用了已弃用的jQuery方法.live()。我能够看到这是因为我正在调试时在chrome的开发者控制台中引发错误。只有在使用1.9版本的jQuery版本时才会发生这种情况(我使用的是1.10.2)。它在1.7中被弃用,但在1.9中完全删除。

解决方案是添加另一个jquery库jquery-migrate-1.2.1.js,可在此处找到:https://github.com/jquery/jquery-migrate#readme,更具体地说(用于开发,而不是生产目的):http://code.jquery.com/jquery-migrate-1.2.1.js。我保存并将此库包含在我的BundleConfig.cs脚本中,其余的按预期工作。我希望这会有所帮助。

答案 1 :(得分:3)

当你错过了jjery.unobtrusive-ajax.min.js时,ajax请求不能与miscrosoft帮助器方法完全同步的问题,比如IsAjaxRequest(),你可以安装它: 1.开放nuget数据包管理器 2.运行命令Install-Package Microsoft.jQuery.Unobtrusive.Ajax

原始信息可在此处找到:https://www.devexpress.com/Support/Center/Question/Details/Q508048

祝你今年夏天多晒太阳

答案 2 :(得分:0)

如果使用AngularJs和$ resource,您可能需要添加此

myAppModule.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
}]);

请参阅this link