在控制器上通过基类属性传递派生类

时间:2013-02-21 10:35:35

标签: c# asp.net-mvc-3 inheritance asp.net-mvc-4 polymorphism

我正在ASP.NET MVC 4 Web应用程序中构建向导式多步骤过程。我正在使用TempData来挂起前面步骤中的信息,因为向导不是严格线性的 - 用户在第一页上的选择实际上导致他们看到第三页的三个选项之一。我通过使用他们的选择将三个派生类中的一个分配给该第三页的viewmodel上的基类属性来实现此目的。页面本身然后使用自定义模型绑定器允许我使用@Html.EditorFor(m => m.BaseContainer)并让它显示正确的模板供用户填写。我的问题是当第三页POST回来时,控制器方法当然是期望一个基类对象,这意味着当我将它保存在TempData中时,它只保存基类属性。

我可以按if (viewModel.BaseContainer is DerivedClass1)的方式进行一系列检查,但这似乎是一个黑客攻击。使用基类的抽象的全部要点是控制器此时不需要知道它是哪一个。是否有更优雅的方法来保存对象而不会丢失派生类的属性?

1 个答案:

答案 0 :(得分:0)

几个月前我们解决了同样的问题。我们使用较小的视图模型为向导中的每个步骤解决了它,然后,在成功验证后,我们将值复制到大视图模型中(包含向导中所有内容的属性)。然后,我们将这个大视图模型存储在TempData中,并继续进行下一步。

如果您在从基类派生时添加新属性,那么您将扩展其接口,您可以为每个派生类中的新属性创建额外的接口,但这听起来不像是一个简单的解决方案。