2012-02-24 98 views
0

好,上溯造型類引用

讓我們假設我有兩個模型類:

public class BaseClass{ 
    public Int32 variable {get;set;} 
} 

public class DerivatedClass : BaseClass{ 
    public Int32 otherVariable {get;set;} 
} 

並與BaseClass的類型爲模型的視圖。

如果我將DerivatedClass傳遞給View並通過表單檢索信息,那麼它將不會「再次」轉換爲DerivatedClass?

問題是,如果我在視圖(Model.GetType().FullName)中檢索Model的類型,我會得到(沒有意外)DerivatedClass類型。

但是當我檢查張貼的模型,我的控制器中,我得到一個BaseClass的(顯然,它不能被鑄造!)

控制器:

public ActionResult ViewPage(){ 
    return View(new DerivatedClass()); 
} 

[HttpPost] 
public ActionResult ViewPage(BaseClass b){ 
    b.GetType().FullName;     //Gives me Project.packeges.BaseClass. 
    DerivatedClass d = (DerivatedClass)b; //Ops, It can't be done. Exception. 
} 

查看:

@model Project.packeges.BaseClass 

<h3>@Model.GetType().FullName</h3> 
<!-- Gives me Project.packeges.DerivatedClass --> 
... 

我的邏輯錯了嗎?無論如何,在檢索POST信息後,在控制器內部執行此操作?

+0

你究竟想要達到什麼目的?具有模型類型的要點是能夠爲MVC創建一個類型,用於*模型化後的數據。指定與您實際想要在視圖中使用不同的類型是自我挫敗。 – 2012-02-24 04:13:57

+0

也許我錯了......但我認爲如果我們可以重用帶有基類模型的視圖到它的子類中,我會很有用......這是OOP的一種方式,不是嗎?代碼重用? – 2012-02-24 18:47:53

回答

1

模型聯編程序將創建一個BaseClass對象並嘗試分配屬性。

因此,當控制來到你的發佈行動,它將在Ba​​seClass而不是子類的實例。

因此,在投下時投擲異常。

當需要BaseClass實例時,可以通過CustomModelBinder和DerievedClass上的Create Instance實現您的需求。

我已經回答了類似的帖子,有完整的描述。

請看看MyPost。這可能是你在找什麼。

+0

我認爲你說的帖子可以幫助我。但是...如果我需要在CreateModel內的兩個派生類之間進行選擇? – 2012-02-24 18:45:30

+0

沒關係...我能解決我的問題。感謝瑪納斯。現在我更好地瞭解ModelBinder在POST後如何將信息傳遞給控制器​​。 – 2012-02-24 19:28:07