Asp.net mvc 3 MVC3 Html.Editor目标字典未绑定到客户端
我的视图模型是按照Asp.net mvc 3 MVC3 Html.Editor目标字典未绑定到客户端,asp.net-mvc-3,dictionary,model-binding,Asp.net Mvc 3,Dictionary,Model Binding,我的视图模型是按照 EditViewModel SomeUserType User Dictionary<string, string> Claims 主要的区别是对@if ViewData.TemplateInfo.TemplateDepth>4的编辑,这将允许MVC深入到足够深的地方,它可以到达我的字典,然后可以正确绑定所有内容。然而,在调试的进一步询问中,我看到当它绑定Key属性时,它实际上只看到@Html.EditorKey,这是如何工作的 显然,编
EditViewModel
SomeUserType User
Dictionary<string, string> Claims
主要的区别是对@if ViewData.TemplateInfo.TemplateDepth>4的编辑,这将允许MVC深入到足够深的地方,它可以到达我的字典,然后可以正确绑定所有内容。然而,在调试的进一步询问中,我看到当它绑定Key属性时,它实际上只看到@Html.EditorKey,这是如何工作的
显然,编辑器必须对ViewData.ModelMetadata.Properties有一定的了解,但它决定ViewData.TemplateInfo.Visited的结果是,它能够正确放置正确的内容,就在这一点上,我对在foreach循环中发生的事情感到困惑,@Html.editorney可以做任何事情。试着这样做:
@{
var 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.TextBox(string.Format("User.Claims[{0}].Key", i), key)
</div>
<div class="editor-label">
@Html.Label(string.Format("User.Claims[{0}].Value", i))
</div>
<div class="editor-field">
@Html.TextBox(string.Format("User.Claims[{0}].Value", i), Model.User.Claims[key])
</div>
</div>
i++;
}
}
试着这样做:
@{
var 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.TextBox(string.Format("User.Claims[{0}].Key", i), key)
</div>
<div class="editor-label">
@Html.Label(string.Format("User.Claims[{0}].Value", i))
</div>
<div class="editor-field">
@Html.TextBox(string.Format("User.Claims[{0}].Value", i), Model.User.Claims[key])
</div>
</div>
i++;
}
}
@Editorstring name将为ViewData中的字段名生成编辑器。如果ViewData不包含对象,则必须使用另一个重载:@Html.Editorstring name,object ViewData
在您的情况下,可以将@Html.Labelstring.FormatUser.Claims[{0}].Key,i替换为@Html.Labelstring.FormatUser.Claims[{0}]。Key,i,User.Claims[i]。Value@Html.Editorstring name将为ViewData中的字段名生成编辑器。如果ViewData不包含对象,则必须使用另一个重载:@Html.Editorstring name,object ViewData
@{
foreach (KeyValuePair<string, string> item in Model.ShippingCarrier)
{
<tr>
<td>
@Html.TextBox(item.Key.ToString(), item.Key, new { @class = "w50" }) : @Html.TextBox(item.Key.ToString(), item.Key, new { @class = "w50" })
</td>
</tr>
}
}
在您的情况下,可以将@Html.Labelstring.FormatUser.Claims[{0}].Key,i替换为@Html.Labelstring.FormatUser.Claims[{0}]。Key,i,User.Claims[i].Value这确实有效,但仍然无法解释为什么编辑器语法不起作用,因为我基本上是在模拟MVC中直接发生的情况,当您更改对象编辑器模板以深入了解模型时,对象编辑器模板中的整个代码主要由@Html.Editorprop.PropertyName@Chris组成Marisic,代码不起作用的原因是您没有将任何模型值传递给编辑器模板。您只是简单地使用User.Claims[i]键语法,但默认模型绑定器将该语法用作输入参数,而助手在获取值时不将其用作输出。就我个人而言,我建议您避免在视图模型中使用字典,并将其替换为自定义类型列表。我不明白我在这里的用法与在对象模板的EditorTemplates/Object.ascx部分中看到的固有工作方式有什么不同,这里的对象模板除了属性名之外没有其他功能明智地说,我不确定为什么这个代码会绑定它,但我的代码不会。我看不出这两个词在上下文上有什么不同。此外,我没有看到与自定义列表相关的任何差异,除了大多数自定义列表的属性比Key/Value更多。我收回了没有看到任何上下文差异的声明,我假设通过调试,我会实际看到property.Name计算为索引字符串值,但它只是键,没有任何类型的索引器,非常奇怪。这确实有效,但仍然不能解释为什么编辑器语法不起作用,当我基本上试图模拟MVC中直接发生的情况时,当您更改对象编辑器模板以深入了解模型时,编辑器语法不起作用。对象编辑器模板中的整个代码主要由@Html.Editorprop.PropertyName@Chris组成Marisic,代码不起作用的原因是您没有将任何模型值传递给编辑器模板。您只是简单地使用User.Claims[i]键语法,但默认模型绑定器将该语法用作输入参数,而助手在获取值时不将其用作输出。就我个人而言,我建议您避免在视图模型中使用字典,并将其替换为自定义类型列表。我不明白我在这里的用法与在对象模板的EditorTemplates/Object.ascx部分中看到的固有工作方式有什么不同,这里的对象模板除了属性名之外没有其他功能明智地说,我不确定为什么这个代码会绑定它,但我的代码不会。我看不出这两个词在上下文上有什么不同。此外,我没有看到与自定义列表相关的任何差异,除了大多数自定义列表的属性比Key/Value更多。我收回了没有看到任何上下文差异的声明,我假设通过调试,我将实际看到property.Name对索引字符串值求值,但它只是键,没有任何类型的索引器,非常奇怪。非常有趣,我将在赏金到期前的周一早上首先检查这个!这绝对是正确的,我还没有弄清楚到底要插入到对象中什么additionalViewData yetASP.NET MVC是开源的,你可以查看源代码来了解背景的一切。非常有趣,我将在周一早上赏金到期前第一件事检查这一点!这绝对是对的,我还没有弄清楚到底要插什么
@{
foreach (KeyValuePair<string, string> item in Model.ShippingCarrier)
{
<tr>
<td>
@Html.TextBox(item.Key.ToString(), item.Key, new { @class = "w50" }) : @Html.TextBox(item.Key.ToString(), item.Key, new { @class = "w50" })
</td>
</tr>
}
}
对象additionalViewData yetASP.NET MVC是开源的,您可以查看源代码以了解后台的一切。