【问题标题】:Ajax.ActionLink not working, Response.IsAjaxRequest() is always falseAjax.ActionLink 不起作用,Response.IsAjaxRequest() 始终为 false
【发布时间】:2011-06-25 19:23:13
【问题描述】:

我已经在谷歌上搜索/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";
        }
    }
    

我总是将“失败”返回到空白页面,而不是目标 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,但无济于事。

【问题讨论】:

  • 有趣的是,这个扩展总是寻找 X-REQUESTED-WITH 标头来确定它是否是 AJAX 请求,由于某种原因,AJAX 请求没有提供它...
  • 我在想也许我有过时的 MicrosoftAjax.js / MicrosoftAjax.Mvc.js,但我真的找不到他们的下载页面..

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


【解决方案1】:

默认情况下,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;
    });
});

【讨论】:

  • 耶!工作完美。非常感谢。
  • 太棒了。感谢您帮助我毫不掩饰地 de-cr**pify 我的代码!
  • 我希望我能给你两次投票,我的朋友。我找不到您在 asp.net/mvc 上分享的任何信息(它似乎已经过时了)。
  • 对我来说稍微改变一下参数效果很好:@Html.ActionLink("Test Two", "TestAjax", null, new { id = "mylink" } );
  • 为什么你觉得手写 jQuery 比使用 Ajax 辅助方法更好?
【解决方案2】:

此处介绍了另一个可能导致 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"
         })

【讨论】:

    【解决方案3】:

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

    您的项目中应该有以下文件:

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

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

    【讨论】:

      【解决方案4】:

      在您的项目中添加 jquery.unobtrusive-ajax.js 包,它应该可以按预期方式工作。

      包括当前脚本形式 CDN:https://www.cdnpkg.com/jquery-ajax-unobtrusive

      <script src="@Url.Content("https://cdnjs.cloudflare.com/ajax/libs/jquery-ajax-unobtrusive/3.2.6/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
      

      或安装包 NuGet: https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Ajax/3.2.6 并应用已安装的捆绑包。

      注意 jquery.unobtrusive-ajax.jsjquery.validate.unobtrusive.js 不相等。

      在我的情况下,这个包没有安装,ajax.action 链接像 html.actionLink 一样工作,并呈现整个视图,而不是在目标 div 中插入部分视图。

      【讨论】:

        猜你喜欢
        • 2019-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 2015-03-08
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        相关资源
        最近更新 更多