我遇到了同样的问题,我的解决方案是在服务层中创建一个小类并将数据映射到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
可以使用 LINQ 轻松生成 s)
Mapper.CreateMap<SelectListItemBase, SelectListItem>();
5)最后,来自视图的代码
@Html.DropDownListFor(m => m.WordTypes,
(IEnumerable<SelectListItem>)Mapper.Map(
Model.WordTypes,
typeof(IList<SelectListItemBase>),
typeof(IList<SelectListItem>))
)
这个简单的任务非常复杂,但允许所需的解耦,如果需要,还可以轻松映射其他属性。