MVC4 Ajax.BeginForm not replacing UpdateTargetId
本文关键字:replacing UpdateTargetId not BeginForm Ajax MVC4 | 更新日期: 2023-09-27 18:01:19
在so上有很多关于Ajax问题的主题。BeginForm没有正确地使用返回的部分视图更新目标元素:
Mvc4 ajax更新同一页面
ASP。. NET MVC 4 - Ajax。BeginForm和html5
MVC 4 (razor) -控制器返回一个局部视图,但整个页面正在更新
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文件。此外,我还验证了页面输出了正确的路径,并找到了正确的文件。我试过切换unobtrusive-ajax.min.js
和validate.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。配置和web。在我的View文件夹中,我包含了:
<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-
属性。
jquery.unobtrusive-ajax有一个问题。因为JQuery 1.9不再支持live()方法了。因此,您应该使用JQuery迁移插件,并引用JQuery迁移js。
请确保在您放置ajax表单的页面中包含了unobtrusious -ajax.js。
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
我遇到了这个问题,我刚刚从NuGet安装了最新的不引人注目的包并解决了这个问题
PM> Install-Package microsoft . jquery . unobusive . ajax
将需要JQ 1.8+
我不知道是否有人会遇到这种情况,但在我的情况下,它只是似乎没有更新。我正在构建一个简单的编辑表单,您可以在其中从下拉菜单中选择要编辑的项目,单击按钮,然后通过AJAX加载所选项目的编辑表单。
它第一次工作了,但是在更改下拉列表中的选择并单击按钮后,没有任何表单值改变,即使我验证了服务器端代码正在将新项加载到视图模型中。所以Replace似乎不起作用了。在逐步完成jquery.unobtrisive-ajax.js之后,我发现它正在替换我的目标元素的内容,只是使用它已经拥有的相同视图标记,这与传递给视图的模型不匹配!
那是当我意识到,这是ModelState
是我。当我第二次点击加载按钮时,它提交了我的下拉选择,也提交了我填写好的编辑表单。编辑表单中的所有值都被添加到ModelState
中(如您所料)。然后,我的控制器代码将提交的视图模型(模型绑定器从编辑表单值创建的视图模型)替换为所选下拉值的视图模型,并将其传递给部分视图。但是,分部视图使用了一堆Html.[X]For
助手方法。它们忽略了更新的视图模型,并直接从ModelState
中提取它们的值。例如:
@Html.DisplayFor(m => m.Name)
@Model.Name
将显示两个不同的Name值;前者显示提交的Name,后者显示更新后的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);
}
我有类似的问题,你-我有我所有的脚本捆绑和加载正确,并有所有的代码实现正确。我检查包管理器,看看是否有脚本需要更新和jQuery和jQuery。unobtrusive-ajax。jQuery从1.9升级到1.9.1。当我重新构建我的解决方案时,目标DIV已成功更新。尝试和更新所有的JS在你的解决方案,它可能工作。
任何使用ajax的页面都需要以下内容
@section Script {
@Scripts.Render("~/bundles/jqueryval")
}
哇,这里有很多答案。我的问题是由于一个引导面板。它正在创建一个"嵌套"面板。我删除了面板标记,只是使用了一个普通的旧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>
对于那些需要更多解释的人....
在Package Manager Console PM> Install-Package jQuery中输入这个。迁移
在你的partialview中引用:
脚本src = " ~/脚本/jquery.unobtrusive-ajax.js ">
祝大家编码愉快。
用户xr280xr对包含
的回答 ModelState.Clear();
对我有用。我正在使用的应用程序是在一个较旧的jQ (1.7.x)上,所以迁移不会在我们的情况下工作。清除控制器中的模型状态正是我们期望BeginForm所做的。
查看母版页或您的页面的脚本参考jquery.unobtrusive-ajax.js
live()方法在jQuery 1.7版本中已弃用,并在1.9版本中删除。请使用on()方法。欲了解更多信息,请参阅:http://www.w3schools.com/jquery/event_live.asp
首先,安装'Microsoft.JQuery.Unobtrusive。Ajax'从NuGet管理器和以后包括' ~/Scripts/jquery。不引人注目的"在" BundleConfig"后包括" jquery - {version} . js ";它看起来像这样:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js",
"~/Scripts/jquery.unobtrusive*));