2009-11-09 72 views
1

假設我們有這樣的事情asp.net的MVC automapper解析

public class Person 
{ 
    public string Name {get; set;} 
    public Country Country {get; set;} 
} 

public class PersonViewModel 
{ 
    public Person Person {get; set;} 
    public SelectList Countries {get; set;} 
} 

可以automapper被用於執行從人到解析成PersonViewModel和回?

+0

是的,這是可能的,但國家從哪裏來? – queen3 2009-11-09 18:36:58

+0

我有一些像CountryService.GetCountries() – Omu 2009-11-10 11:57:14

回答

3

不要爲此使用AutoMapper - 這不值得。例如,在出現驗證失敗並且再次顯示錶單的情況下 - AutoMapper在此處不會執行(通常)。我們通常走兩條路線:

  • 如果該列表是不特定的上下文,創建查詢一些ISelectListProvider的選擇列表項的的HtmlHelper:Html.DropDownList()。您將使用您選擇的IoC容器來查找personListProvider,查詢項目列表並填充下拉列表。
  • 如果該列表是上下文特定的,只是構建列表中的控制器動作
+0

您能否告訴我您對此ViewModel模式的看法http://stackoverflow.com/questions/1361092/asp-net-mvc-viewmodel-pattern – Omu 2009-11-11 10:10:51

2

聽起來好像你想通過PersonViewModel發送一個Person到視圖中,該PersonViewModel擁有你需要生成並返回一個新的(或更新的)Person對象的所有額外信息。

如果這是正確的,我不認爲你需要automapper。根據我對automapper的瞭解,它將映射相關對象的集合映射到更多視圖模型類型的狀態,但在這種情況下,您正在向客戶端發送一個Person並嘗試接收一個Person。在這種情況下,使用視圖模型填充頁面似乎更容易,但是讓頁面返回一個Person(或從視圖模型中提取更新的Person以節省一些擊鍵)。


編輯:這就是說,是的你應該能夠使用automapper來移動信息。它只是這個簡單場景的不必要的層。

+0

其實我已經做了這樣的事情,但脂肪酶說這是不好的http://stackoverflow.com/questions/1361092/asp-net-mvc-viewmodel-pattern – Omu 2009-11-10 12:03:00

+0

問題2在你的接受的答案指的是您在視圖模型中包含了一個SelectListItem枚舉(這使您的控制器實現了特定於視圖的信息)。你需要做的修改是使它成爲一個IEnumerable (或者一些國家類型而不是字符串),以便你的視圖可以決定如何顯示這些信息。傳遞選擇列表意味着有關視圖應如何顯示數據的信息,這與MVC的想法背道而馳。 – 2009-11-10 14:54:57

2

如果一個選擇,你可以這樣做:

public class Person 
{ 
    public string Name {get; set;} 
    public Country Country {get; set;} 
    public Country[] GetCountries 
    { 
    ... add method for countries here 
    } 
} 

然後在您的視圖模型,你可以有你從該集合中選擇列表拉取數據。

public class PersonViewModel 
{ 
    public Person Person {get; set;} 
    public Country[] Countries {get; set;} 
    public SelectList Countries { get{ .. add new select list code here getting vals from Countries..}} 
} 

此外,這是用於上下文相關列表。然而,你在這裏弄糊塗了一點點(如果一個人得到一個國家的名單?)