C# 通过表单检索类引用后向上转换类引用

C# 通过表单检索类引用后向上转换类引用,c#,asp.net-mvc,asp.net-mvc-3,upcasting,C#,Asp.net Mvc,Asp.net Mvc 3,Upcasting,那么 假设我有两个模型类: public class BaseClass{ public Int32 variable {get;set;} } public class DerivatedClass : BaseClass{ public Int32 otherVariable {get;set;} } 以及以基类类型作为模型的视图 如果我将一个派生类传递给视图并通过表单检索信息,它就不会再次被派生类“强制转换”了 问题是,如果我在视图中检索模型的类型(Model.Get

那么

假设我有两个模型类:

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

public class DerivatedClass : BaseClass{
    public Int32 otherVariable {get;set;}
} 
以及以基类类型作为模型的视图

如果我将一个派生类传递给视图并通过表单检索信息,它就不会再次被派生类“强制转换”了

问题是,如果我在视图中检索模型的类型(Model.GetType().FullName),我会得到一个派生类类型(毫不奇怪)

但是当我检查发布的模型时,在我的控制器内,我得到了一个基类(显然,它不能被铸造!)

控制器:

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
@Model.GetType().FullName
...

我的逻辑错了吗?在检索POST信息后,是否仍有必要在控制器内部执行此强制转换?

模型绑定器将创建基类对象并尝试分配属性

因此,当控件到达post操作时,它将在基类而不是子类上拥有实例

所以,它在向下投射时抛出异常

当请求基类实例时,可以通过CustomModelBinder和在DerievedClass上创建实例来实现您的需求

我已经回答了一个类似的帖子,并给出了完整的描述


请查看一下“”。这可能就是您想要的。

您到底想要实现什么?拥有一个模型类型的全部意义在于能够为MVC提供一个类型来为数据建模。指定一个不同于您实际希望在视图中使用的类型会弄巧成拙。也许我错了。。。但我认为,如果我们可以将带有基类模型的视图重用到它的子类中,我会很有用。。。这是OOP的支柱之一,不是吗?代码重用?我想你说的帖子可以帮我。但是如果我需要在CreateModel中的两个派生类之间进行选择?无需考虑。。。我能解决我的问题。谢谢玛纳斯。现在我更好地理解了ModelBinder在发布后如何将信息传递给控制器。
@model Project.packeges.BaseClass

<h3>@Model.GetType().FullName</h3>  
<!-- Gives me Project.packeges.DerivatedClass -->
...