为啥 Ajax.ActionLink 更新整个页面而不仅仅是 UpdateTarget

Posted

技术标签:

【中文标题】为啥 Ajax.ActionLink 更新整个页面而不仅仅是 UpdateTarget【英文标题】:Why is Ajax.ActionLink updating entire page instead of just UpdateTarget为什么 Ajax.ActionLink 更新整个页面而不仅仅是 UpdateTarget 【发布时间】:2014-05-02 05:13:50 【问题描述】:

这应该只替换 UpdateTarget,但它没有,它替换了整个页面,我不明白为什么。正在返回正确的局部视图,但不是替换目标 id,而是替换整个页面。

<div id="magHeader">
        <p>this is a test.</p>
        @Ajax.ActionLink("Edit", "GetEditor", "Home", new AjaxOptions() UpdateTargetId = "magHeader", InsertionMode = InsertionMode.Replace)
</div>

在运行时,链接如下所示:

<a href="/Home/GetEditor" data-ajax-update="#magHeader" data-ajax-mode="replace" data-ajax="true">Edit</a>

我做错了什么吗?过去已成功完成此操作,没有任何问题。

编辑 此问题的根本原因是在 VS 2012 中,您只需添加对 JQueryVal 包的引用即可使其正常工作。但是,在 2013 年,BundleConfig.cs 发生了更改,因此 JQueryVal 包不再包含 JQuery.Unobtrusive。所以简单的解决方法是将它重新添加到包中:

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.unobtrusive*",
                    "~/Scripts/jquery.validate*"));

然后一切都会按预期工作。

【问题讨论】:

【参考方案1】:

检查您是否在某处将@Scripts.Render("~/bundles/jqueryval") 加载到您的页面中。这可能是因为未加载不显眼的 javascript 文件。检查这个video

编辑: 请检查您的 packages.config 文件中是否安装了软件包。

<package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.1.1" targetFramework="net451" />
  <package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.0.0" targetFramework="net451" />

【讨论】:

好的,所以我看了视频,这正是我遇到的问题。但是,它仍然没有解决。从 VS 13 中的一个新项目开始,我按照视频中的步骤操作并确保包含 jqueryval。但是整个页面仍然被替换。在 FireFox 中,我可以检查脚本选项卡并查看 jqueryval 以及 jquery.validate.unobtrusive.js 是否已加载。所以没有任何意义。 我检查并没有安装这些软件包。所以我安装了它们。但是,我仍然得到相同的结果 - 页面被替换,而不是 id。 是你的控制器方法的签名 Public PartialViewResult 并返回 PartialView("someview") 请注意,当我使用 Visual Studio 2012 进行相同测试时,它的工作方式与您在视频中显示的完全一样。我只是添加了对 JQueryVal 的引用,效果很好。 VS 12/13 的区别在于,在 2013 年的项目中,JqueryVal 包不再包含对 unobtrusive 的引用。所以你必须手动添加它。【参考方案2】:

发生这种情况的主要原因是您的 jquery 脚本文件和 jquery unobtrusive ajax 未包含在主布局或子视图中,恐怕您是缺少它们,在视图中包含 jquery、jquery 不显眼的 ajax 文件,它会像魅力一样工作。

【讨论】:

【参考方案3】:

添加下面的脚本文件参考有效。

<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

【讨论】:

以上是关于为啥 Ajax.ActionLink 更新整个页面而不仅仅是 UpdateTarget的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC Ajax.ActionLink 简单用法

@Ajax.ActionLink跳转页面的问题解决方案 MVC Ajax不支持问题

@Ajax.ActionLink跳转页面的问题解决方案 MVC Ajax不支持问题

MVC 5 排序和过滤数据

Ajax.ActionLink 在表中的标题后插入?

使 html 链接 href 属性等于 Ajax.ActionLink