到目前为止,我已经使用Model类来嵌入相关值的列表,以在视图中呈现为DropDownList。例如,假设我有一个Contact Model属性,其中包含ContactType属性
public class Contact {
...
public int ContactTypeID { get; set; }
...
}
ContactTypeID引用包含所有联系人类型(如Customer,Supplier等)的数据库表中的一行。我已成功使用到目前为止,Contact类的属性称为,例如,ContactTypeList,如下例所示
public IEnumerable<SelectListItem> ContactTypeList {
get {
return GetContactTypeList().Select(
t => new SelectListItem { Text = t.Description,
Value = t.ContactTypeID.ToString() });
}
}
这种方式使用强类型视图时我可以按照以下方式执行
<%: Html.DropDownListFor( model => model.ContactTypeID, Model.ContactTypeList, new {} )%>
这种方法可以解决任何问题,但从SoC的角度来看并不完全干净。
在一个新项目中,我开始使用存储库模式和StructureMap作为DI / IoC工具,因此模型类不再具有对从底层数据存储获取数据的存储库类的引用。
我知道我总是可以使用控制器和ViewData / ViewBag来获取这些列表以传递视图,但我想知道这是否是实现范围的好方法。
你在项目中做得怎么样?实现结果并使代码保持清洁的最佳方法是什么?
感谢您的帮助
答案 0 :(得分:1)
在我们的项目中,我们还使用ViewData来存储列表并在视图中使用它们,它没有任何问题。
答案 1 :(得分:1)
在我的项目中,我使用视图模型和控制器来操作模型:
型号:
public class ContactViewModel
{
public int ContactTypeID { get; set; }
public IEnumerable<SelectListItem> ContactTypeList { get; set; }
}
控制器:
public class ContactsController
{
private readonly IContactsRepository _repository;
public ContactsController(IContactsRepository repository)
{
_repository = repository;
}
[AutoMap(typeof(Contact), typeof(ContactViewModel))]
public ActionResult Index()
{
var model = _repository.GetContacts();
return View(model);
}
}
使用的AutoMap
属性是一个动作过滤器,它将在控制器动作之后执行,它将使用AutoMapper将传递给视图的模型(Contact)替换为相应的视图模型(ContactViewModel
)。你可能会在我写的sample project structure中看到它。
现在很明显,如果您要在整个项目中显示此联系人下拉列表,则需要单独的控制器和子操作,这些操作将在您的视图中使用Html.Action helper重复使用。