【问题标题】:Incorrect model property value rendered in partial view局部视图中呈现的模型属性值不正确
【发布时间】:2012-08-04 08:07:25
【问题描述】:

我有一个强类型的局部视图,它的模型包含一个与父页面的视图模型同名的属性。出于某种原因,渲染引擎正在渲染父视图模型的值,而不是预期的值(嗯,至少是我预期的值!)

父页面视图模型提取:

public class ParentPageViewModel
{
    public int Id { get; set; } // problem property
    ...
    public IEnumerable<ChildViewModel> Children { get; set; }
}

子页面视图模型提取:

public class ChildViewModel
{
    public int Id { get; set; } // problem property
    ...
}

父页面提取(Razor):

@model ParentPageViewModel
...
@foreach (var item in Model.Children)
{
    @Html.Partial("MyPartialView", item)
}
...

部分视图摘录:

@model ChildViewModel
...
<form ...>
    @Html.HiddenFor(m => m.Id) // problem here - get ParentPageViewModel.ID not ChildViewModel.Id
</form>
...

所以基本上在我的渲染输出中,我的隐藏字段具有父视图模型元素的值,而不是传递给局部视图的值。这肯定是由名称引起的,因为将 @ChildViewModel.Id@ 的名称更改为 @ChildViewModel.ChildId@ 使其按预期工作。有趣的是,在调试器中检查视图模型值时,我确实看到了正确的值;只有渲染的输出是错误的。

有没有办法绕过这个或“正确”的方式来做我想做的事情(我在表格中呈现迷你表单以进行 ajax 验证/发布对表格行的更新)

谢谢,

提姆

【问题讨论】:

  • HtmlHelpers 将首先从 ModelState 字典中获取值(甚至超过模型中的值) - 看起来这就是这种行为的原因。

标签: c# asp.net-mvc razor partial-views asp.net-mvc-viewmodel


【解决方案1】:

我认为将您的电话改为 this 将解决问题:

@Html.Partial("MyPartialView", item, new ViewDataDictionary())

子视图正在从 ViewData 字典中获取值 - 因此这会将新字典传递给子视图 (hattip danludwig)。

【讨论】:

  • +1 我也打算将此添加到我的答案中,但在我完成之前不得不离开。没错,子模型从父视图数据字典中获取 ID。
  • 是的,这行得通,尽管我确实使用了自己的答案(手工制作的 标签),因为我的部分视图被到处使用,所以想要避免忘记“新”的风险ViewDataDictionary()' 部分。谢谢。
  • @TimCroydon 以防止这种风险,您可以创建一个 HtmlHelper 扩展方法来执行此操作 - 也意味着您也可以在一个地方硬编码“MyPartialView”名称。
【解决方案2】:

找到了解决办法,只是手动创建隐藏字段,例如:

<input type="hidden" name="Id" value="@Model.Id" />

而不是使用 Html.HiddenFor。

(我暂时不会将此标记为已回答,以防有其他解决方案或任何人可以解释问题)

【讨论】:

    【解决方案3】:

    我知道这是一篇旧帖子。但我想,既然我在遇到同样的问题时来到这里,我也不妨做出贡献。 我的问题有点不同。就我而言,在触发需要刷新整个页面/视图的部分视图操作后,主视图的 ID 不正确。我用 ModelState.Clear 解决了这个问题

    ModelState.Clear();
    return View("Maintenance", model);  //call main view from partial view action
    

    【讨论】:

      【解决方案4】:

      在 Views/Shared/EditorTemplates 中创建一个名为 ChildViewModel.cshtml 的文件。将您的部分视图放入该文件中:

      在 ~/Views/Shared/EditorTemplates/ChildViewModel.cshtml 中

      @model ChildViewModel
      ...
      <form ...>
          @Html.HiddenFor(m => m.Id)
      </form>
      ...
      

      然后,像这样渲染它:

      @model ParentPageViewModel
      ...
      @foreach (var item in Model.Children)
      {
          @Html.EditorFor(m => item)
      }
      ...
      

      或者,如果您希望将视图保留为部分视图而不是编辑器模板,请使用Simon's answer

      【讨论】:

        猜你喜欢
        • 2014-06-24
        • 1970-01-01
        • 1970-01-01
        • 2013-12-22
        • 2014-08-18
        • 2020-12-07
        • 2011-08-05
        • 2013-07-28
        • 1970-01-01
        相关资源
        最近更新 更多