我有一个强类型的局部视图,其模型包含一个与父页面视图模型同名的属性。由于某种原因,渲染引擎渲染父视图模型值,而不是预期值(嗯,至少我期望的值!)
父页面视图模型提取:
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验证/发布表行更新)
谢谢,
添
答案 0 :(得分:14)
我认为改变对此的调用将解决问题:
@Html.Partial("MyPartialView", item, new ViewDataDictionary())
子视图从ViewData字典中获取值 - 因此这会将新字典传递给子视图(hattip danludwig)。
答案 1 :(得分:1)
我知道这是一篇旧帖子。但是当我遇到同样的问题时,我认为自从我降落在这里,我不妨做出贡献。 我的问题有点不同。在我的情况下,在部分视图操作需要刷新整个页面/视图被触发后,主视图的ID不正确。我用ModelState.Clear
解决了这个问题ModelState.Clear();
return View("Maintenance", model); //call main view from partial view action
答案 2 :(得分:0)
在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。
答案 3 :(得分:0)
找到一个解决方案,只需手动创建隐藏字段,例如:
<input type="hidden" name="Id" value="@Model.Id" />
而不是使用Html.HiddenFor。
(如果有任何其他解决方案或任何人都可以解释问题,我不会将此标记为答案一段时间)