Nat*_*ins 2 c# casting model-binding asp.net-mvc-3
假设我有两个类派生于另一个类:
动物和狗
public class Animal
{
public String Name { get; set; }
}
public class Dog : Animal
{
public Boolean HasSpots { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我将动物传递给索引视图
public ActionResult Index()
{
return View(new Dog() {Name = "Dog"});
}
Run Code Online (Sandbox Code Playgroud)
索引 - 我将传入的Animal转换为带有Dog的编辑器模板.
@model MvcApplication1.Models.Animal
@using (Html.BeginForm("About", "Home", FormMethod.Post, null))
{
@Html.EditorFor(x => x, "Dog", "Animal")
<input type="submit" value="Begin" />
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但是当我尝试在我的控制器中显式转换回Dog时,我将它发布到About它将不会投射.我想象一下,我将不得不创建一个自定义模型绑定器,但我不知道如何做到这一点.或者,如果我完全错过了一些东西.没有包括接口的任何方式.
(使用它作为一个小测试示例,我的实际类更复杂一些)
默认模型绑定程序不会尝试猜测您是否发布了比预期更多的派生类.因此,即使你有一个表格有一个更多派生类的字段,如果动作是期待类动物,它将创建动物,你将无法施放给狗,因为从来没有创建过狗.
我没有看到界面帮助你的方法.如果您使操作接受接口或抽象类,则默认模型绑定器将抛出异常,因为它无法实例化所述类型.
自定义模型绑定器可以为您处理这种情况.我见过的所有方法都涉及到一些额外的元数据.
这里使用附加表单字段来保存实际类型的示例. 带有List <BaseClass>的ViewModel和编辑器模板
这里使用属性来执行某种"已知类型"的示例.http://mvccontrib.codeplex.com/wikipage?title=DerivedTypeModelBinder&referringTitle=Documentation