1

使用时

<%= 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 { })%>

不太喜欢这个解决方案 + 我知道我可以在局部视图中创建列表,这也很丑陋,
还有其他解决方案吗?

4

1 回答 1

1

I have discovered that this is a bug in MVC. It's not fixed, though there is a work around. See my question answered by myself (I had the same problem before finding your post).

MVC4 binding drop down list in a list (bug)

Regards
Craig

于 2013-02-19T11:54:07.063 回答