Ajax.ActionLink无法正常工作,Response.IsAjaxRequest()始终为false

时间:2011-02-11 20:18:06

标签: asp.net asp.net-mvc ajax

我一直在谷歌搜索/ SO:这个问题有一段时间了,很多人似乎都在分享这个问题,但我没有找到任何成功解决我的问题的方法。

使用MVC3和Razor。

  1. 母版页包含:

    <script src="@Url.Content("~/Scripts/jquery-1.5.min.js")" type="text/javascript"></script>

    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>

    <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>

  2. AjaxTest.cshtml包含:

    <div id="AjaxTestDiv">content</div>

    @Ajax.ActionLink("Update", "AjaxTester", new AjaxOptions { UpdateTargetId = "AjaxTestDiv" })

  3. AjaxTester操作方法:

    public string AjaxTester()
    {
        if (Request.IsAjaxRequest())
        {
            return DateTime.Now.ToString();
        }
        else
        {
            return "FAIL";
        }
    }
    
  4. 我总是将“失败”返回到空白页面,而不是目标div。

    编辑:另请注意,如果我删除if(Request.IsAjaxRequest()),我仍然不会返回目标div,而是返回空白页。

    Edit2:查看生成的HTML,这是我的链接:

    <a data-ajax="true" data-ajax-method="POST" data-ajax-mode="replace"
    data-ajax-update="#AjaxTestDiv" href="/Area/AjaxTester">Update</a>
    

    尝试将方法切换到GET,但无济于事。

3 个答案:

答案 0 :(得分:47)

默认情况下,ASP.NET MVC 3对所有Ajax.*帮助程序使用不显眼的jquery。所以首先要摆脱所有的MicrosoftAjax脚本(这个无用的c ** p),然后改为:

<script src="@Url.Content("~/Scripts/jquery-1.5.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

然后只需在web.config中激活不显眼的AJAX(如果尚未完成):

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

现在jquery将不引人注意地AJAXify包含那些HTML 5 data-*属性的所有链接。

甚至更好的恕我直言:

在您看来简单:

@Html.ActionLink("Update", "AjaxTester", new { id = "mylink" })

并在一个单独的javascript文件中AJAXify这个锚:

$(function() {
    $('#mylink').click(function() {
        $('#AjaxTestDiv').load(this.href);
        return false;
    });
});

答案 1 :(得分:1)

可以使ActionLink无法正常运行的另一个特定于IE的问题在此处介绍:ASP.NET MVC - Prevent Cache on Ajax.ActionLinks

基本上,IE有时会缓存Ajax GET请求,因此将AjaxOption的HttpMethod设置为POST是构建ActionLink的一种不太脆弱的方式:

@Ajax.ActionLink(
       item.Name + " (Ajax link test)",
         "MyActionName",
         routeValues: new { id = item.Id },
         ajaxOptions: new AjaxOptions()
         {
              UpdateTargetId = "divToUpdate",
              InsertionMode = InsertionMode.Replace,
              HttpMethod = "POST"
         })

答案 2 :(得分:0)

对于那些仍然面临此问题的人:

您的项目中的某处应具有以下文件:

enter image description here

如果没有,以下是nuget软件包,请从Visual Studio项目或软件包管理器控制台的nuget Manager中下载该软件包: https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Validation/3.2.11/

在您各自的视图或布局文件的jquery.min.js最新版本之后提供上述添加文件的参考:

enter image description here