C# MVC4 Ajax.BeginForm不替换UpdateTargetId
关于Ajax.BeginForm的问题有太多的主题。没有使用返回部分视图正确更新目标元素:C# MVC4 Ajax.BeginForm不替换UpdateTargetId,c#,ajax,asp.net-mvc-4,ajax.beginform,razor-2,C#,Ajax,Asp.net Mvc 4,Ajax.beginform,Razor 2,关于Ajax.BeginForm的问题有太多的主题。没有使用返回部分视图正确更新目标元素: 但是,所有这些问题都可以通过手动写出jQueryAjax或包含缺少的javascript文件来解决 @using (Ajax.BeginForm("PostcardDetails", new AjaxOptions() { InsertionMode = InsertionMode.Replace, UpdateTargetId = "details" })) {
但是,所有这些问题都可以通过手动写出jQueryAjax或包含缺少的javascript文件来解决
@using (Ajax.BeginForm("PostcardDetails", new AjaxOptions()
{
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "details"
}))
{
<div id="PostcardSearchResults">
@{Html.RenderAction("PostcardSearchResults", Model);}
</div>
}
<div id="details">
</div>
在我的布局中,我引用了这些jQuery文件。此外,我还验证了页面是否输出了正确的路径,以及是否找到了正确的文件。我尝试过将不显眼的ajax.min.js
和验证.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和“我的视图”文件夹中的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中的表单元素正在填充所有正确的
数据-
属性。jquery.unobtrusive-ajax.min和jquery 1.9存在问题,因为jquery 1.9不支持任何live()方法。因此,您应该使用JQuery migrate插件,并参考JQuery migrate js。我遇到了与您类似的问题-我已正确绑定和加载了所有脚本,并正确实现了所有代码。我检查了PackageManager,查看是否有脚本需要更新,jQuery和jQuery.unobtrusive-ajax确实需要更新。jQuery从1.9升级到1.9.1。重建解决方案时,目标DIV已成功更新。尝试并更新解决方案中的所有JS,它可能会起作用。以下内容需要出现在任何使用ajax的页面上
@section Script {
@Scripts.Render("~/bundles/jqueryval")
}
我遇到了这个问题,我刚刚安装了NuGet最新的不引人注目的软件包并解决了这个问题 PM>安装包Microsoft.jQuery.Unobtrusive.Ajax
将需要JQ 1.8+确保将unobtrusive-ajax.js包含到页面中,您已将ajax表单放在该页面中
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
对于那些需要更多解释的人 在PackageManager控制台PM>InstallPackagejQuery.Migrate中键入此命令 请在您的partialview中引用: script src=“~/Scripts/jquery.unobtrusive ajax.js”>
很高兴为大家编写代码。我不知道是否还有其他人会遇到这种情况,但就我而言,它只是看起来没有更新。我正在构建一个简单的编辑表单,您可以从下拉列表中选择要编辑的项目,单击一个按钮,然后AJAX为所选项目加载一个编辑表单 它第一次起作用,但在更改下拉列表中的选择并单击按钮后,没有任何表单值发生更改,即使我验证了服务器端代码正在将新项加载到视图模型中。所以它似乎不起作用。在遍历jquery.unobtrisive-ajax.js之后,我发现它正在替换我的目标元素的内容,只是使用它已经拥有的相同视图标记,这与传递给视图的模型不匹配 那时我才意识到,是
ModelState
吸引了我。第二次单击“加载”按钮时,它提交了我的下拉选择,同时也提交了我填写的编辑表单。编辑表单中的所有值都被添加到ModelState
(如您所料)。然后,我的控制器代码将提交的视图模型(模型绑定器从编辑表单值创建)替换为所选下拉值的视图模型,并将其传递给局部视图。然而,部分视图使用了一组Html.[X]作为
helper方法。它们忽略更新的视图模型,并直接从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);
}
用户xr280xr关于包括的回答
ModelState.Clear()代码>
为我工作。我正在使用的应用程序是在一个较旧的jQ(1.7.x)上,因此在我们的情况下,migrate无法工作。清除控制器中的模型状态正是我们所期望的。检查母版页或您页面的脚本参考
jquery.unobtrusive-ajax.js
如果不添加关于此js的参考:jquery.unobtrusive-ajax.jslive()方法在jquery 1.7版中被弃用,并在1.9版中被删除。请改用on()方法。有关更多信息,请参阅:哇,这里有很多答案。我的问题是由于一个引导面板。它正在创建一个“嵌套”面板。我删除了面板标记,只使用了一个普通的旧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>
@使用(Ajax.BeginForm(“EditNote”,new{id=Model.id},new AjaxOptions{UpdateTargetId=“notes form”},htmlAttributes:new{@class=“form horizontal”}))
{
}
首先,从NuGet Manager安装'Microsoft.JQuery.Unobtrusive.Ajax,然后在包含“JQuery-{version}.js”之后在“BundleConfig”中包含“~/Scripts/JQuery.Unobtrusive”;看起来与此类似:
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js",
"~/Scripts/jquery.unobtrusive*));
有点困惑,这和OP问题有什么关系?你是说。live就是Ajax。Beginform在引擎盖下使用的吗?是的,Ajax Beginform在引擎盖下使用live控制器被正确调用了吗?当你得到回报时,你得到了什么?你使用的是MVC4,所以你不需要把@Url.Content(“~/Scripts/globalize.js”)放在sce中,只需使用“~/Scripts/globalize.js”
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js",
"~/Scripts/jquery.unobtrusive*));