Я столкнулся с той же проблемой, и мое решение состояло в том, чтобы создать крошечный класс в слое служб и отобразить данные на SelectListItem
s в представлении. Пример кода:
1) Суррогатный класс в слое услуг:
public class SelectListItemBase
{
public String Value { get; set; }
public String Text { get; set; }
}
2) Вид модели:
public class FetchWordsIntegrationViewModel
{
public IList<SelectListItemBase> WordTypes { get; private set; }
public FetchWordsIntegrationViewModel()
{
WordTypes = new List<SelectListItemBase>();
WordTypes.Add(new SelectListItemBase() { Value = "0", Text = Constants.Ids.SelectionListDefaultText });
WordTypes.Add(new SelectListItemBase() { Value = ((int)FetchedWordType.ProperNoun).ToString(), Text = "Proper noun" });
// other select list items here
}
}
3) Код в действии
public ActionResult Index()
{
var vm = theService.CreateViewModel();
return View(vm);
}
4) Отображение с использованием Automapper (это не требуется, поскольку SelectListItem
s можно легко сгенерировать с помощью LINQ)
Mapper.CreateMap<SelectListItemBase, SelectListItem>();
5) Наконец, код из вида
@Html.DropDownListFor(m => m.WordTypes,
(IEnumerable<SelectListItem>)Mapper.Map(
Model.WordTypes,
typeof(IList<SelectListItemBase>),
typeof(IList<SelectListItem>))
)
Это довольно сложная задача для этой простой задачи, но она позволяет желаемое разделение, а также позволяет легко сопоставлять другие свойства, если это необходимо.