2012-05-04 47 views
6

大家好我叫車輛的基類,我在那裏有所有常見的所有車輛的屬性和我有多個派生類叫車,吉普車從車輛派生並添加更多的屬性ASP.NET MVC 3.0模型綁定與基類和派生類?

例:

public class Vehicle 
{ 
    public int Color { get; set; } 
    public double Cost { get; set; } 
} 


public class Car : Vehicle 
{ 
    public SelectListItem Option { get; set; } 
} 

我有,我有車輛列表這樣

public class Page 
{ 
    public List<Vehicle> vehicles { get; set; } 
} 

Page類我的觀點是堅決類型Page類所以在我看來,我遍歷所有的車輛在頁面上顯示這樣,這個代碼是內部@using(Html.BeginForm()),所以我們回來後用戶選擇

for(int i=0;i<Model.Vehicles.Count;i++) 
{ 
    <div id="Question"> 
     @{ 
      @Html.EditorFor(m => m.Vehicle[i], VehicleConstants.GetTemplateName(Model.Questions[i])); 
     } 
    <br /> 
    </div> 
} 

我使用一個編輯模板,爲每種類型的車輛,這樣的函數調用VehicleConstants.GetTemplateName剛剛返回模板的名稱使用基於車輛的類型

這個模板只是在汽車類或吉普類(派生類+基類)

我遇到的問題是寫屬性時的形式是張貼回來我只能訪問我的控制器中的基類車輛的屬性我無法獲取屬性的值次級轎車或吉普車。

 [HttpPost] 
    public string ReadPost(Page page) 
    { 
    } 

什麼是最好的方式來獲取這些值自動綁定當表單被回發?

創建自定義活頁夾類是我唯一的選擇嗎?是否有人可以提供一些示例代碼來說明如何做到這一點?任何幫助非常感謝。

回答

6

您將不得不爲此使用自定義模型聯編程序。默認的模型聯編程序不知道要實例化的具體類型。您可以在每行內包含一個隱藏字段,指出您的自定義模型聯編程序將創建的具體類型。我有shown this in action here。順便說一下,通過使用標準模板命名約定,您可以擺脫正在使用的for循環以及VehicleConstants.GetTemplateName方法。