2012-11-18 82 views
2

可以說我有兩個類從另一個派生:MVC模型綁定和鑄造

動物和狗

public class Animal 
{ 
    public String Name { get; set; } 
} 

public class Dog : Animal 
{ 
    public Boolean HasSpots { get; set; } 
} 

在我控制我傳遞一個動物到索引視圖

public ActionResult Index() 
{ 
    return View(new Dog() {Name = "Dog"}); 
} 

索引 - 我將傳入的動畫投射到需要狗的編輯器模板中。

@model MvcApplication1.Models.Animal 

@using (Html.BeginForm("About", "Home", FormMethod.Post, null)) 
{ 
    @Html.EditorFor(x => x, "Dog", "Animal") 

    <input type="submit" value="Begin" /> 
} 

能正常工作像它應該但當我嘗試顯式轉換回犬在我的控制器,當我把它張貼到關於它不會投。我想象一下,我將不得不創建一個自定義模型綁定器,但我不知道如何做到這一點。或者如果我完全錯過了某些東西。沒有包括接口的任何方法。

(以此爲一個小的測試例子我實際的類稍微複雜一點)

+0

爲什麼不把視圖的模型類型設置爲'Dog'? – GolfWolf

+0

因爲這只是一個顯示問題的例子。我會這樣做,但如果我可以 –

回答

5

默認的model binder不會嘗試猜,如果你要發送一個更派生類比它期待。所以即使你的表格有一個派生類更多的領域,如果行動期待類動物,它會創造動物,你將無法施放給狗,因爲狗從來沒有創建。

我沒有看到接口的方式來幫助你。如果你讓你的動作接受一個接口或抽象類,默認的模型聯編程序會拋出一個異常,因爲它不能實例化這些類型。

自定義模型聯編程序可以爲您處理這種情況。我所見過的所有方法都涉及將一些額外的元數據加入混合中。

使用附加表單字段來保存實際類型的示例在這裏。 ViewModel with List<BaseClass> and editor templates

使用屬性做一種「已知類型」的例子就在這裏。 http://mvccontrib.codeplex.com/wikipage?title=DerivedTypeModelBinder&referringTitle=Documentation

+0

謝謝你!沒有真正期待模型綁定。我結束了使用'DerivedTypeModelBinder –