2012-02-24 65 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