2011-03-20 72 views
0

我正在學習ASP MVC和我有問題。我有類公司具有聚合性質:我應該如何處理ASP MVC中的聚合模型?

public class Company 
{ 
    public Company() 
    { 
     Address = new Address(); 
    } 

    public int Id { get; set; }  
    public string Name { get; set; } 
    public virtual Address Address { get; set; } 
} 

和地址類:

public class Address 
{  
    public int Id { get; set; }  
    public string Country { get; set; } 
    public string City { get; set; } 
    ... 
} 

我應該怎麼寫編輯對這個領域?我試圖創建控件AddressDetail並將其傳遞給Address屬性上的UiHint屬性,但在視圖中,我有其他Id屬性來編輯(!?)。當我隱藏它後,模型狀態是無效的,因爲這個屬性是必需的。 另一個問題是,公司庫應該如何看待?它應該以某種方式使用AddressRepository或者自己寫地址?

也許有人有這種情況的例子嗎?

回答

2

只要地址類有一個參數的構造函數(如貴公司類),默認的MVC模型綁定器將有處理你的對象沒有問題。這不是問題,您的公司類和地址類都有一個Id屬性。

MVC會默認使用像「身份證」和「Address.Id」,這允許ModelBinder的兩個特性區分名指定您inputfields。

你可以在Global.asax中註冊一個編輯器模板您的地址類,或者你可以簡單的做一個局部視圖,並通過它Company.Address在主視圖。

+0

它不像創建視圖模型一樣優雅,但我的簡單對象,我不希望創建與映射屬性巨大類。編輯器模板是我所需要的。謝謝。 – bizon 2011-03-21 19:02:35

+0

我不確定我會將平面視圖模型方法歸類爲更優雅。在我看來,MVCS能力序列化和deserialise自定義屬性類型遞歸是更真棒featues之一(雖然是最肯定不會是平坦)。 然而,使用圖模型可以是在一些情況下,這有利於。 – DEHAAS 2011-03-21 22:00:17

3

解決此問題的一種方法是創建一個組合這些字段的視圖模型。您可以將其傳遞給視圖,並讓您的控制器將其轉換回您的業務模型。例如:

public class CompanyViewModel 
{   
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Country { get; set; } 
    public string City { get; set; } 
} 

再如,退房「模式3」的位置:http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

+0

這正是我所做的。但是,要意識到客戶可以很容易地將DOM元素中的「Id」更改爲除正在更新的Id之外的Id,並導致更新公司的信息。 (這就是爲什麼'ID'應該由路線來處理) – 2011-03-20 16:06:06

+0

@Jim好點。 – 2011-03-20 18:05:00

+2

@Jim您應該始終具有安全性以驗證經過身份驗證的用戶是否有權編輯實體。永遠不要相信客戶端發送的數據。 – Ryan 2011-03-21 04:47:25