MVC中模型绑定期间属性上的KnownType属性?

时间:2011-09-28 17:23:34

标签: c# asp.net asp.net-mvc asp.net-mvc-3 c#-4.0

假设我有食物类和一类源自食物的BirdFood:

public class Food
{
   ...
}

public class BirdFood : Food
{
    public int SeedCount { get; set; }
}

让我说我有一个类Creature和一个源自Creature的类Bird

public class Creature
{
    public Food Food { get; set; }
}

public class Bird : Creature
{
   ...
}

最后,假设我有一个生物视图模型:

public class ViewModel
{
    public Creature Creature { get; set; }
}

当我创建Bird的实例时,我还创建了一个BirdFood实例并将其分配给Food属性并将视图模型传递给View。很简单。

    public ActionResult Index()
    {
        ViewModel viewModel = new ViewModel();

        viewModel.Creature = new Bird();

        viewModel.Creature.Food = new BirdFood() { SeedCount = 100 } ;

        return View(viewModel);
    }

观点:

<% using(Html.BeginForm("Save", "Home", FormMethod.Post))
   { %>

   <%: Html.Hidden("Creature.Food.SeedCount", (Model.Creature.Food as MvcApplication6.Controllers.BirdFood).SeedCount)  %>

   <input type="submit" />

<% } %>

好的,这是问题所在。当在Action中接收到视图模型时,Creature属性是基类Creature,而不是派生类型Bird,派生类型BirdFood的SeedCount属性带有post参数(来自firebug),看起来像Creature.Food.SeedCount 100

enter image description here

好的,我的问题是,当模型绑定时如何保留派生类型?我怀疑它与自定义Model Binder有关,但是当谈到它时我很无能为力。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

默认模型绑定器只检查视图模型中的类型并使用这些类。他猜不出你想要一些派生类。可以使用custom model binder来提供此类提示。这是another one