使用时
<%= Html.DropDownListFor(model => model.FeeTypeId, Model.GetFeeTypes(), new { })%>
在这种情况下,在呈现选择时根据 Model.FeeTypeId 选择正确的选项。
但是
,如果您使用部分视图呈现表单,将其传递给特定的 HtmlFieldPrefix (例如,如果您想要呈现两个相同的视图并希望元素具有不同的 ID,则需要它)
<% Html.RenderPartial("path-to-partial-view", Model, new ViewDataDictionary() { TemplateInfo = new TemplateInfo() { HtmlFieldPrefix = "myPrefix" } }); %>
那么该值将不会被选中。
看起来类似于EditorTemplate 中 DropDownListFor 的问题,它没有选择值,而是来自不同的原因。
查看 MVC 3 源代码,似乎问题出在SelectInternal
它使用的方法上,htmlHelper.ViewData.Eval(fullName);
当它包含前缀时无法通过全名获取值,
TextBoxFor 不会失败,因为它将表达式的值传递给 InputHelper它不能使用 ViewData.Eval
只是为了确保在局部视图中对其进行了测试:
在局部视图中,将打印以下内容 "myPrefix.FeeTypeId"
<%= Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName("FeeTypeId") %>
以下将打印"by property name: [value] by full name: [empty string]"
<%="by property name: " + Html.ViewData.Eval("FeeTypeId")%><br />
<%= "by full name: " + Html.ViewData.Eval(Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName("FeeTypeId"))%>
我找到的唯一解决方案是在 Model.GetFeeTypes() 生成一个列表并将我想要的选项标记为选中:
<%= Html.DropDownListFor(model => model.FeeTypeId, Model.GetFeeTypes(Model.FeeTypeId), new { })%>
不太喜欢这个解决方案 + 我知道我可以在局部视图中创建列表,这也很丑陋,
还有其他解决方案吗?