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

时间:2011-01-23 00:24:54

标签: asp.net-mvc asp.net-mvc-2 drop-down-menu asp.net-mvc-3 repository-pattern

到目前为止,我已经使用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来获取这些列表以传递视图,但我想知道这是否是实现范围的好方法。

你在项目中做得怎么样?实现结果并使代码保持清洁的最佳方法是什么?

感谢您的帮助

2 个答案:

答案 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重复使用。