2013-02-26 67 views
10

上有与Ajax.BeginForm不能正确地与回报局部视图更新目标元素,以便有关问题这么多的主题:
mvc4 ajax updating same page
ASP.NET MVC 4 - Ajax.BeginForm and html5
MVC 4 (razor) - Controller is returning a partialview but entire page is being updated
MVC 4 Ajax is not updating the PartialView within the page
但是,所有这些都可以通过手动编写jQuery ajax或包含缺少的javascript文件来回答。MVC4 Ajax.BeginForm不更换UpdateTargetId

@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.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,在我看来,文件夹中的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-属性。

回答

11

jquery.unobtrusive-ajax.min和JQuery 1.9存在问题,因为JQuery 1.9不支持live()方法任何more。所以你应该使用JQuery迁移插件,并引用JQuery迁移js。

+1

有点困惑,它与OP问题有什么关系?你是说.live是Ajax.Beginform在底层使用的吗? – Shenaniganz 2013-02-26 18:02:07

+0

忘了提,我已经更新了我的'jquery.unobtrusive-ajax.min.js'与建议,由这个帖子:http://stackoverflow.com/a/14512797/28310 如果我没有,我会得到JavaScript错误。我也尝试使用jquery-migrate。 – drovani 2013-02-26 18:20:48

+1

是啊Ajax Beginform在引擎盖下使用 – 2013-02-26 18:24:11

1

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

1

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

@section Script { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
2

我有这个问题,我刚从的NuGet安装了最新的不引人注目的软件包,并解决了这个问题

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

是否需要JQ 1.8+

4

请确保您将unobtrusive-ajax.js添加到您已放置ajax表单的页面中。

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

对于那些需要多一点的解释....

在软件包管理控制台PM本型>安装,包装jQuery.Migrate在partialview

参考这样的:

script src =“〜/ Scripts/jquery。不显眼,ajax.js“>

编码愉快的每一个人。

1

我不知道有没有人会碰到这一点,但对我来说,它只是似乎不需要升级。我是建设在您选择您希望从下拉编辑的项目的简单编辑表单,点击一个按钮,它AJAX加载所选项目的编辑形式。

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

那时候我意识到,那是ModelState让我感觉到了。第二次点击加载按钮,它提交我的下拉选择,但也填写了我的编辑表单。编辑表单中的所有值都被添加到ModelState(如您所期望的)。然后,我的控制器代码将所提交的视图模型(即从编辑表单值创建的模型联编程序)替换为所选下拉值的视图模型,并将其传递给局部视图。但是,局部视图使用了一堆帮助器方法。这些忽略更新后的视图模型并直接从ModelState中提取它们的值。例如:

@Html.DisplayFor(m => m.Name) 
@Model.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); 
    } 
0

用户xr280xr对包括

ModelState.Clear();

答案为我工作。我正在使用的应用程序是在一个较旧的jQ(1.7.x)上,所以迁移在我们的情况下不起作用。清除控制器中的模型状态完全符合我们预期BeginForm的要求。

0

检查主页或专页的脚本参考有关 jquery.unobtrusive-ajax.js 如果不添加引用这个JS:jquery.unobtrusive-ajax.js

+0

加什么?这是一个不完整的答案。 – AndroidMechanic 2016-01-13 06:46:20

+0

有关此参考:jquery.unobtrusive-ajax.js – 2016-01-25 09:22:47

0

哇,这里有很多答案。我的问题是由于引导面板。它正在创建一个“嵌套”面板。我删除了面板标记,只是使用一个普通的旧的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> 
0

首先,安装“Microsoft.JQuery.Unobtrusive。Ajax的'从的NuGet管理器和以后包括 “〜/脚本/ jquery.unobtrusive” 中的 “BundleConfig”包括后 “jquery- {版本} .js文件”;这看起来类似于这样的:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
       "~/Scripts/jquery-{version}.js", 
       "~/Scripts/jquery.unobtrusive*));