Asp.net mvc 使用存储库类时的Html.Dropdownlist值

Asp.net mvc 使用存储库类时的Html.Dropdownlist值,asp.net-mvc,asp.net-mvc-2,drop-down-menu,asp.net-mvc-3,repository-pattern,Asp.net Mvc,Asp.net Mvc 2,Drop Down Menu,Asp.net Mvc 3,Repository Pattern,到目前为止,我一直使用Model类嵌入相关值的列表,以在视图中呈现为DropDownList。例如,假设我有一个Contact模型类,其中包含ContactType属性 public class Contact { ... public int ContactTypeID { get; set; } ... } ContactTypeID引用数据库表中的一行,该行包含所有联系人类型,如客户、供应商等。到目前为止,我已经成功地使用了contact类的一个属性,称为Cont

到目前为止,我一直使用Model类嵌入相关值的列表,以在视图中呈现为DropDownList。例如,假设我有一个Contact模型类,其中包含ContactType属性

public class Contact {
    ...
    public int ContactTypeID { get; set; }
    ...
}
ContactTypeID引用数据库表中的一行,该行包含所有联系人类型,如客户、供应商等。到目前为止,我已经成功地使用了contact类的一个属性,称为ContactTypeList,如下示例所示

public IEnumerable<SelectListItem> ContactTypeList {
    get {
        return GetContactTypeList().Select(
            t => new SelectListItem { Text = t.Description, 
                 Value = t.ContactTypeID.ToString() });
    }
}
public IEnumerable联系人类型列表{
得到{
返回GetContactTypeList()。选择(
t=>new SelectListItem{Text=t.说明,
值=t.ContactTypeID.ToString()});
}
}
这样,当使用强类型视图时,我可以按以下方式执行

<%: Html.DropDownListFor( model => model.ContactTypeID, Model.ContactTypeList, new {} )%>
model.ContactTypeID,model.ContactTypeList,新建{}]>
这种方法没有任何问题,但从SoC的角度来看,它不是完全干净的

在一个新项目中,我开始使用repository模式和StructureMap作为DI/IoC工具,因此模型类不再引用从底层数据存储获取数据的repository类

我知道我总是可以使用控制器和ViewData/ViewBag将这些列表传递到视图中,但我想知道这是否是实现范围的好方法

你的项目进展如何?实现结果并保持代码干净的最佳方法是什么


感谢您在我们的项目中提供的帮助,我们还使用ViewData存储列表并在视图中使用它们,其中没有任何错误。

在我的项目中,我使用视图模型和控制器来操作模型:

型号:

public class ContactViewModel
{
    public int ContactTypeID { get; set; }
    public IEnumerable<SelectListItem> ContactTypeList { get; set; }
}
使用的
AutoMap
属性有一个操作过滤器,它将在控制器操作后执行,并使用AutoMap将传递给视图(Contact)的模型替换为相应的视图模型(
ContactViewModel
)。你可以在我写的一篇文章中看到它的作用


现在很明显,如果您要在整个项目中显示此联系人下拉列表,它应该有一个单独的控制器和一个子操作,它将在您的视图中使用。

太棒了!!感谢您的自动映射建议:)
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);
    }
}