1

到目前为止,我已经使用Model类来嵌入相关值的列表,以在视图中呈现为DropDownList。例如,假设我有一个其中有使用存储库类时的Html.Dropdownlist值

public class Contact { 
    ... 
    public int ContactTypeID { get; set; } 
    ... 
} 

ContactTypeID一个ContactType属性跟模型类,它包含所有的接触类型,如客户,供应商,等等。我已经成功地使用,直到数据库表中引用的行现在所谓的联系类的属性,例如,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让这些列表通过视图,但我想知道这是否是实现范围的好方法。

您的项目过得怎么样?实现结果并让代码保持清洁的最佳方式是什么?

感谢您的帮助

回答

1

在我们的项目中,我们还可以使用ViewData的存储列表,并在视图中使用它们,有没有什么错吧。

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

+0

好东西!!感谢您的自动映射建议:) – Lorenzo 2011-01-26 01:08:16