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 -->
...