Я в значительной степени полагаюсь на EditorTemplates в своем приложении, но столкнулся с проблемой, которую не могу решить, не отходя от EditorTemplates для раскрывающихся списков.
Рассмотрим эту модель (View):
public class CreateStudentViewModel
{
public DropDownList StudentTypes { get; set; }
public CreateStudent Command { get; set; }
}
public class DropDownList {
public string SelectedValue { get; set; }
public IList<SelectListItem> Items { get; set; }
}
public class CreateStudent {
public string Name { get; set; }
public int StudentTypeId { get; set; }
}
Я использую это, чтобы предоставить пользователю внешнего интерфейса возможность установить тип ученика, это делается с помощью следующего EditorTemplate:
@model DropDownList
<div class="form-group@(Html.ValidationErrorFor(m => m.SelectedValue, " has-error"))">
@Html.LabelFor(m => m)
@Html.DropDownListFor(m => m.SelectedValue, Model.Items)
@Html.ValidationMessageFor(m => m.SelectedValue, null)
</div>
И используется в моем представлении:
@Html.EditorFor(m => m.StudentTypes)
Теперь этот EditorTemplate привязан к StudentTypes.SelectedValue
на DropDownList
, что в некоторых случаях хорошо, но мне нужно привязать это к моему Model.Command.StudentTypeId
здесь.
Я знаю, что могу переместить весь этот код непосредственно в представление и напрямую связать его, вместо того, чтобы размещать его внутри EditorTemplate, но я постараюсь избежать этого.
В идеале я думаю о расширении EditorFor, чтобы обеспечить такой способ:
@Html.EditorFor(m => m.StudentTypes, new { selectedValue = Model.Command.StudentTypeId });
Но я не могу перевести это как-то так:
@Html.DropDownList(@ViewBag.selectedValue.ToString(), Model.Items);
Поскольку это просто помещает значение (int) в качестве имени поля. Любые предложения приветствуются! :-)