通过表单检索后的上传类引用

时间:2012-02-24 04:03:36

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

那么,

假设我有两个Model类:

public class BaseClass{
    public Int32 variable {get;set;}
}

public class DerivatedClass : BaseClass{
    public Int32 otherVariable {get;set;}
} 

以BaseClass类型为模型的视图。

如果我将DerivatedClass传递给View并通过表单检索信息,那么它不会再次“转换”为DerivatedClass吗?

问题在于,如果我在视图中检索Model的类型(Model.GetType()。FullName),我会得到(没有意外)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信息后,无论如何都要在控制器内进行此操作?

1 个答案:

答案 0 :(得分:1)

模型绑定器将创建一个BaseClass对象并尝试分配属性。

因此,当控制进入你的post动作时,它将在Ba​​seClass上有实例而不是子类。

因此,它在向下投射时抛出异常。

当要求BaseClass实例时,可以通过CustomModelBinder和DerievedClass上的Create Instance实现您的需求。

我已经回复了类似的帖子,并有完整的描述。

请查看MyPost。这可能就是您要找的内容。