【发布时间】:2011-03-24 19:46:00
【问题描述】:
我的视图模型是这样的
EditViewModel
SomeUserType User
Dictionary<string, string> Claims
在我看来,我试图将其绑定如下
@{
int i = 0;
foreach (var key in Model.User.Claims.Keys)
{
<div class="editor">
<input type="hidden" value="@i" name="User.Claims.Index">
<div class="editor-label">
@Html.Label(string.Format("User.Claims[{0}].Key", i))
</div>
<div class="editor-field">
@Html.Editor(string.Format("User.Claims[{0}].Key", i))
</div>
<div class="editor-label">
@Html.Label(string.Format("User.Claims[{0}].Value", i))
</div>
<div class="editor-field">
@Html.Editor(string.Format("User.Claims[{0}].Value", i))
</div>
</div>
i++;
}
}
正如我所期望的那样,它会在编辑屏幕上呈现一系列键值对文本框。但是,即使 Claims 字典中有 KeyValuePairs,文本框也始终为空。
如果我填写 KVP 文本框的值并将表单发回我的控制器,我确实可以将值正确地模型绑定到我的 User.Claims 字典中。
我错过了什么导致绑定在视图加载时无法在其中包含正确的值?
编辑: 附加信息,基本上我试图弄清楚这对于 MVC 究竟是如何工作的。我直接从 Brad Wilson discusses here 的核心 MVC (2) 对象模板创建了上面的视图。我试图在 Razor 中找到确切的代码,但我在任何地方都找不到它……离题了……将它转换为 Razor 我最终得到了
@if (ViewData.TemplateInfo.TemplateDepth > 4)
{
@ViewData.ModelMetadata.SimpleDisplayText
}
else
{
<div class="editor">
@foreach (var prop in ViewData.ModelMetadata.Properties
.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm)))
{
if (prop.HideSurroundingHtml)
{
@Html.Editor(prop.PropertyName)
}
else
{
if (!String.IsNullOrEmpty(Html.Label(prop.PropertyName)
.ToHtmlString()))
{
<div class="editor-label"> @Html.Label(prop.PropertyName)
</div>
}
<div class="editor-field">
@Html.Editor(prop.PropertyName)
@Html.ValidationMessage(prop.PropertyName)
</div>
}
}
</div>
}
主要区别在于对@if (ViewData.TemplateInfo.TemplateDepth > 4) 的编辑,这将允许 MVC 深入到我的字典中,然后可以正确绑定所有内容。然而,在进一步询问调试后,我看到它何时绑定了它实际上只看到 @Html.Editor("Key") 的 Key 属性,这是如何工作的?
显然编辑器必须对 ViewData.ModelMetadata.Properties 有某种了解,但是它确定 ViewData.TemplateInfo.Visited() 的结果是它能够正确放置正确的东西,就在这一点上,我处于失去了在 @Html.Editor("Key") 做任何事情的这个 foreach 循环内部发生的事情。
【问题讨论】:
标签: asp.net-mvc-3 dictionary model-binding