【问题标题】:Ajax.BeginForm not updating target divAjax.BeginForm 不更新目标 div
【发布时间】:2012-03-07 11:30:39
【问题描述】:

控制器:

public ActionResult Edit(string temp)
{
     ViewBag.Time = DateTime.Now.ToString("hh:mm:ss");
     return PartialView("Edit");
}

局部视图:

@using (Ajax.BeginForm("Edit", "Home", new AjaxOptions{UpdateTargetId = "mydiv"}))
    {
        <input type="submit" value="Save" />
    }

索引视图(部分内容)

<div id="mydiv">
    <span>The Time is: @ViewBag.Time</span>
</div>
@Html.Partial("Edit")

ClientValidationEnabledUnobtrusiveJavaScriptEnabledtrue 已添加jquery.validate.min.jsjquery.validate.unobtrusive.min.jsjquery.unobtrusive-ajax.min.jsMicrosoftMvcAjax.jsMicrosoftAjax.js

首先,时间显示正确。当第一次单击 Save 按钮时,时间消失,Save 按钮显示两次,然后除了在单击两个按钮时调用 Action 之外什么也没有发生。

【问题讨论】:

  • 您可能还想将 InsertionMode 设置为替换

标签: asp.net-mvc-3 asp.net-ajax


【解决方案1】:

你的事情有点倒退。试试这个:

控制器

public ActionResult Edit(string temp)   
{  
    ViewBag.Time = DateTime.Now.ToString("hh:mm:ss");  
    return PartialView("Edit");   
}

索引视图

@using (Ajax.BeginForm("Edit", "Home", new AjaxOptions{UpdateTargetId = "mydiv"}))     
    {     
        <input type="submit" value="Save" />     
    }            
@Html.Action("Edit") 

局部视图(编辑)

<div id="mydiv">
    <span>The Time is: @ViewBag.Time</span> 
</div>

ViewBag 只能在运行时(页面初始加载时)访问,因此这意味着如果您通过 ajax 获取数据,则控制器操作中的 viewbag 只能访问该控制器操作的部分视图(而不是 index.cshtml它通过ajax调用动作)。简而言之(tl;dr)为了能够使用您在编辑操作中设置的视图包,您需要在返回的部分视图中使用它。 (而不是其他任何地方,因为内容不是由 razor 引擎重新渲染的)

【讨论】:

  • 虽然我没有尝试过你的解决方案,但这里有什么过时的?为什么我不能在我的部分视图中拥有表单并在索引视图中更新 div?背后的逻辑是什么?
  • 因为 1. 为什么要多次获取表单?表单永远不会改变,每次获取表单时都没有不同的数据,它始终是相同的数据。这就是为什么您最好将它放在主视图中,而不是在通过 ajax 获取的视图中。 2. ViewBag 只能在运行时(页面初始加载时)访问,因此这意味着如果您通过 ajax 获取数据,控制器操作中的视图包只能访问该控制器操作的部分视图(而不是 index.cshtml通过 ajax 调用动作)
  • 简而言之 (tl;dr) 为了能够使用您在编辑操作中设置的视图包,您需要在返回的部分视图中使用它。 (而不是其他任何地方)
  • 我认为你已经错过了拥有UpdateTargetId 的想法,尝试你的解决方案而不使用AjaxOptions 和 div,我认为它仍然可以工作
  • 不,因为在我的解决方案中,id 为“mydiv”的 div 内容将在每次提交时替换为部分视图内容。从而像您想要的那样正确地渲染时间。在您的问题中,每次单击提交按钮时都会呈现表单的新实例,并且时间永远不会更新,因为 Viewbag 无法在任何地方呈现,因为部分视图不使用它。如果我没有在这里说清楚,我很抱歉。
【解决方案2】:
I set things up like so. 

很简单,但我注意到发帖的人 问题和答案没有插入模式,所以我发布了这段蹩脚的代码:)

 {
                                                                            HttpMethod = "post",
                                                                            InsertionMode = InsertionMode.Replace,
                                                                            UpdateTargetId = "the div youwant to update / replace"
                                                                        } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    相关资源
    最近更新 更多