14

关于 Ajax.BeginForm 没有正确更新目标元素的问题有很多关于返回部分视图的问题:
mvc4 ajax 更新同一页面
ASP.NET MVC 4 - Ajax.BeginForm 和 html5
MVC 4 (razor) - Controller is返回一个局部视图但整个页面正在更新
MVC 4 Ajax 没有更新页面内的 PartialView
但是,所有这些都可以通过手动写出 jQuery ajax 或包含丢失的 javascript 文件来回答。

  @using (Ajax.BeginForm("PostcardDetails", new AjaxOptions()
  {
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "details"
  }))
  {
    <div id="PostcardSearchResults">
      @{Html.RenderAction("PostcardSearchResults", Model);}
    </div>
  }
  <div id="details">
  </div>

相关控制器代码:

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)]
public ActionResult PostcardSearchResults(PostcardSearchFilter filter)
{
        PostcardSearchResults model = new PostcardSearchResults(filter);
        return PartialView("_PostcardSearchResults", model);
}

在我的布局中,我引用了这些 jQuery 文件。此外,我已验证该页面正在输出正确的路径,并且它找到了正确的文件。我试过切换 and 的顺序unobtrusive-ajax.min.jsvalidate.min.js但没有成功。

<script type="text/javascript" src="@Url.Content("~/Scripts/globalize.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.9.1.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-ui-1.10.0.custom.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>

此外,在我网站的根 web.config 和我的 View 文件夹中的 web.config 中,我包括:

<add key="webpages:Version" value="2.0.0.0"/>
<add key="PreserveLoginUrl" value="true"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>

我不知道还能去哪里看。没有抛出 javascript 错误,并且控制器被正确命中,返回 PartialViewResult。HTML 中的 Form 元素填充了所有正确的data-属性。

4

12 回答 12

13

jquery.unobtrusive-ajax.min 和 JQuery 1.9 存在问题,因为 JQuery 1.9 不再支持 live() 方法。所以你应该使用JQuery migrate 插件,并参考JQuery migrate js。

于 2013-02-26T17:57:19.750 回答
5

确保将 unobtrusive-ajax.js 包含到您放置 ajax 表单的页面中。

<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
于 2014-11-09T16:20:10.253 回答
2

我遇到了这个问题,我刚刚从 NuGet 安装了最新的不显眼的包并解决了这个问题

PM> 安装包 Microsoft.jQuery.Unobtrusive.Ajax

需要JQ 1.8+

于 2014-04-27T20:42:46.130 回答
2

我不知道其他人是否会遇到这种情况,但就我而言,它似乎只是没有更新。我正在构建一个简单的编辑表单,您可以在其中从下拉列表中选择要编辑的项目,单击一个按钮,然后 AJAX 会为所选项目加载一个编辑表单。

它第一次工作,但在更改下拉列表中的选择并单击按钮后,没有任何表单值更改,即使我验证了我的服务器端代码正在将新项目加载到视图模型中。所以看起来替换不起作用。在逐步浏览 jquery.unobtrisive-ajax.js 之后,我发现它正在替换我的目标元素的内容,只是使用它已经拥有的相同视图标记,这与传递给视图的模型不匹配!

就在那时我意识到,正是它ModelState让我着迷。我第二次单击加载按钮时,它提交了我的下拉选择以及我填写的编辑表单。编辑表单中的所有值都已添加到ModelState(如您所料)。然后,我的控制器代码将提交的视图模型(模型绑定器从编辑表单值创建)替换为所选下拉值的视图模型,并将其传递给局部视图。然而,局部视图使用了一堆Html.[X]For辅助方法。这些忽略更新的视图模型并直接从ModelState. 例如:

@Html.DisplayFor(m => m.Name)
@Model.Name

将显示两个不同的名称值;前者显示提交的名称,后者显示更新的名称。这是让 MVC 在(服务器端)验证错误后记住用户表单条目的机制。在这种情况下,因为这是部分页面加载并且我只是丢弃了所有提交的值,所以我不需要任何 ModelState 值,所以我只需调用 ModelState.Clear() 在返回我的更新视图之前视图模型。

    public ActionResult GetItemEditForm(EditItemsViewModel editItemsVM)
    {
        if (editItemsVM.SelectedItemID != null)
        {
            //Load the selected item
            ItemsModelManager.GetEditItemsVM(editItemsVM);

            //Clear the submitted form values
            ModelState.Clear();
        }

        return PartialView("_ItemsEditor", editItemsVM);
    }
于 2015-09-23T21:47:06.463 回答
1

以下内容需要在任何使用 ajax 的页面上。

@section Script {
    @Scripts.Render("~/bundles/jqueryval")
}
于 2013-11-20T23:20:26.470 回答
1

我遇到了与您类似的问题 - 我将所有脚本捆绑并正确加载,并且所有代码都正确实现。我检查了包管理器以查看是否需要更新任何脚本,而 jQuery 和 jquery.unobtrusive-ajax 确实需要。jQuery 从 1.9 升级到 1.9.1。当我重建我的解决方案时,目标 DIV 已成功更新。尝试更新解决方案中的所有 JS,它可能会起作用。

于 2013-03-03T15:33:42.613 回答
1

哇,这里有很多答案。我的问题是由于引导面板。它正在创建一个“嵌套”面板。我删除了面板标记,只使用了一个普通的旧 div,它就可以工作了。我认为 UpdateTargetId 必须是 AJAX 表单的直接父级。

这是说明问题的html。

<div class="panel panel-default" id="notes-form">
  <div class="panel-body">
    @using (Ajax.BeginForm("EditNote", new { id = Model.Id }, new AjaxOptions { UpdateTargetId = "notes-form" }, htmlAttributes: new { @class = "form-horizontal" }))
    {
    }
  </div>
</div>
于 2016-08-12T19:07:54.017 回答
0

对于那些需要更多解释的人......

在包管理器控制台 PM> Install-Package jQuery.Migrate 中键入此内容

在您的部分视图中引用此内容:

脚本 src="~/Scripts/jquery.unobtrusive-ajax.js">

祝大家编码愉快。

于 2015-03-04T21:33:06.613 回答
0

如果未添加有关此 js 的参考,请检查母版页或您的页面的脚本参考关于 jquery.unobtrusive-ajax.js:jquery.unobtrusive-ajax.js

于 2016-01-13T06:18:08.250 回答
0

首先,从 NuGet Manager安装“ Microsoft.JQuery.Unobtrusive.Ajax ”,然后在“ BundleConfig”中包含“ jquery-{version}.js ”后包含“ ~/Scripts/jquery.unobtrusive ”;这看起来类似于:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-{version}.js",
                "~/Scripts/jquery.unobtrusive*));
于 2016-12-22T07:25:59.193 回答
0

live() 方法在 jQuery 1.7 版中被弃用,并在 1.9 版中被删除。请改用 on() 方法。有关更多信息,请参阅:http ://www.w3schools.com/jquery/event_live.asp

于 2016-06-17T11:08:07.223 回答
0

用户 xr280xr 的回答包括

ModelState.Clear();

为我工作。我正在使用的应用程序位于较旧的 jQ (1.7.x) 上,因此 migrate 在我们的情况下不起作用。清除控制器中的模型状态正是我们期望 BeginForm 做的事情。

于 2015-11-10T20:13:12.053 回答