Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC4 Ajax.BeginForm不替换UpdateTargetId_C#_Ajax_Asp.net Mvc 4_Ajax.beginform_Razor 2 - Fatal编程技术网

C# MVC4 Ajax.BeginForm不替换UpdateTargetId

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" })) {

关于Ajax.BeginForm的问题有太多的主题。没有使用返回部分视图正确更新目标元素:




但是,所有这些问题都可以通过手动写出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.js

live()方法在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*));