2011-03-19 66 views
2

追加到子類MVC3模型的白名單中我使用白名單將查詢字符串/表單值綁定到我的模型。這是通過:使用BindAttribute

[Bind(Include = "Size,Color,Age,SizeOfTeeth")] 
public class AnimalModel { ... } 

但說我有一個子類的模型,叫做ElephantModel,我想保持從基類的白名單,以及一些派生類的屬性添加到它。我會怎麼做?

我想:

[Bind(Include += "TrunkLength,Personality")] 
public class ElephantModel : AnimalModel { ... } 

但是,當然,這是行不通的。我懷疑這實際上更像是一個「屬性」問題,而不是「綁定」問題,但我無法弄清楚使用什麼語法。

TIA!馬特

回答

1

子類BindAttribute似乎是最好的,但它的標記密封。所以後來我想修改子類的構造函數中的屬性,但是使用反射,除非必要,否則我寧願避免。

所以我選擇了這種方法的基礎類:

[Bind(Include = WhiteList)] 
public class AnimalModel { 

    protected const string WhiteList = "Size,Color,Age,SizeOfTeeth"; 

} 

然後在子類:

[Bind(Include = WhiteList)] 
public class ElephantModel : AnimalModel { 

    new protected const string WhiteList = AnimalModel.WhiteList + ",TrunkLength,Personality"; 

} 

不幸的是,這意味着該屬性必須在子類中重新定義(如要修改它)。但這並不是什麼大問題。

1

恐怕這是不可能的,因爲屬性在C#中的性質。屬性表示在編譯時烘焙到生成的程序集中的元數據,這意味着它們只能在編譯時獲取已知的表達式。

我推薦你的一種可能的解決方法是使用視圖模型。因此,例如,你將有以下視圖模型中,你將只包括真正應該綁定的屬性:

public class UpdateElephantViewModel 
{ 
    public int Size { get; set; } 
    public string Color { get; set; } 
    public int Age { get; set; } 
    public int SizeOfTeeth { get; set; } 
    public int TrunkLength { get; set; } 
    public string Personality { get; set; } 
} 

這也可能是這樣的,如果基礎視圖模型將被重用:

public class UpdateAnimalViewModel 
{ 
    public int Size { get; set; } 
    public string Color { get; set; } 
    public int Age { get; set; } 
    public int SizeOfTeeth { get; set; } 
} 

public class UpdateElephantViewModel : UpdateAnimalViewModel 
{ 
    public int TrunkLength { get; set; } 
    public string Personality { get; set; } 
} 

,然後你可以有以下的控制器操作:

[HttpPost] 
public ActionResult Update(UpdateElephantViewModel model) 
{ 
    ... 
} 

終於視圖模型與實際模型大象之間進行映射。爲了簡化這兩種類型之間的映射,您可以使用AutoMapper

+0

+1:我無法低估ViewModels的精彩(當然,它與視圖緊密相連),而不是使用通用領域模型(又名poco's)作爲視圖的模型。那麼說(再次)Darin :) – 2011-03-19 23:50:46

+0

達林:欣賞你的意見。我正在使用具有所有這些屬性的輸入模型,並且執行嚴格的驗證,檢查底部發布,過量發佈,XSS向量等。這就是爲什麼我需要BindAttribute。至於AutoMapper,我不喜歡這種工具的魔力,並且只要可能,就更願意堅守老派的面向對象。 – Matt0 2011-03-20 02:42:56

+0

Pure:傾向於接受輸入模型到我的控制器中,這應該關注域邏輯。然後控制器創建適當的視圖模型並將其傳遞給視圖。再次,老派封裝,少魔術,更容易維護。 – Matt0 2011-03-20 02:45:22