我遇到了同样的问题,我的解决方案是在服务层创建一个小类,并将数据映射到视图中的SelectListItem
。示例代码:
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
可以使用LI很容易地生成NQ)
Mapper.CreateMap<SelectListItemBase, SelectListItem>();
5)最后,从该视图
@Html.DropDownListFor(m => m.WordTypes,
(IEnumerable<SelectListItem>)Mapper.Map(
Model.WordTypes,
typeof(IList<SelectListItemBase>),
typeof(IList<SelectListItem>))
)
正是由于这一简单的任务相当迂回,但允许期望的去耦,也允许容易地图等性能,如果需要的话代码。
是的,这是我的问题,其他人是怎么做的。你如何描述我是如何做到的,但是当SelectListItem返回某种类型时,不需要进行所有转换。我可以做DropDL.Foo = Repository.SomeListdata而不是havng来转换所有的时间。我实际上返回IEnumerable,然后再转换,但我只是想获得其他想法 –
2011-03-26 19:59:55
@William因此,你最好的选择是在你的应用程序中有一个FooDropDownService,它从数据存储获取你的Foo列表并转换为你的DropDownList类型应用。 – Swaff 2011-03-26 20:08:22
这意味着必须为每个应用程序类型创建一个服务(一般来说,我的服务与存储库位于同一个dll中,并且由所有人使用)我想您可以创建您自己的FooSelectListItem类,以便由服务返回并从MVC DLL解耦 – 2011-03-26 20:14:23