Кажется, что это действительно ошибка или, по крайней мере, несоответствие в ASP.NET MVC 2. Я проверил его источник и обнаружил, что метод InputHelper (), вызванный из помощника TextBoxFor (), получает значение по умолчанию, рассчитанное с
ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model
Но метод SelectInternal (), вызываемый из помощника DropDownListFor (), получает только имя элемента управления, найденного с помощью метода ExpressionHelper.GetExpressionText ().
Таким образом, SelectInternal () пытается найти значение по умолчанию, используя метод ViewData.Eval () из MVC 1. Известно, что этот метод не может извлечь значения из массивов по числовому индексу.
Так в вашем случае применимы
<%: Html.DropDownListFor(model => model.Sch_ID) %>
<%= Html.TextBoxFor(model => model.Vragen[i].Evvr_Type)%>
но не
<%: Html.DropDownListFor(model => model.Vragen[i].Evvr_Type) %>
потому что это эквивалентно
<%: Html.DropDownList("Vragen[" + i + "].Evvr_Type") %>
В то же время я хочу еще раз подчеркнуть, что
<%= Html.TextBoxFor(model => model.Vragen[i].Evvr_Type)%>
не эквивалентно
<%= Html.TextBox("model.Vragen[" + i + "].Evvr_Type")%>
потому что последний даже в MVC 2 не может связать значение по умолчанию.
Возможные обходные пути
Первый . Так как SelectInternal () также проверяет словарь ModelState, вы можете заполнить этот словарь перед возвратом представления.
for (int i=0; i < fevb.Vragen.Count(); i++)
ModelState.Add("Vragen[" + i + "].Evvr_Type", new ModelState
{
Value = new ValueProviderResult(fevb.Vragen[i].Evvr_Type, null,
CultureInfo.CurrentCulture)
});
Это будет сделано самим MVC после публикации, поэтому вы должны делать это вручную только в первый раз.
Второй . Вместо
<%= Html.DropDownListFor(model => model.Vragen[i].Evvr_Type,
ViewData["vraagtype"] as List<SelectListItem>)%>
использование
<%= Html.DropDownListFor(model => model.Vragen[i].Evvr_Type,
new SelectList(ViewData["vraagtype"] as IEnumerable, "Value", "Text",
Model.Vragen[i].Evvr_Type))%>
ViewData ["vraagtype"] в этом случае не обязательно должен содержать объекты SelectListItem, достаточно любого IEnumerable. Вы можете проверить описание метода SelectList () в случае необходимости.