6

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

父页面视图模型提取:

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 验证/发布对表格行的更新)

谢谢,

蒂姆

4

4 回答 4

14

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

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

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

于 2012-08-07T11:23:24.217 回答
2

找到了解决方案,只需手动创建隐藏字段,例如:

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

而不是使用 Html.HiddenFor。

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

于 2012-08-07T11:18:32.357 回答
2

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

ModelState.Clear();
return View("Maintenance", model);  //call main view from partial view action
于 2016-06-26T08:08:40.677 回答
0

在 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 的答案

于 2012-08-07T11:18:09.817 回答