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