那么,
假设我有两个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信息后,无论如何都要在控制器内进行此操作?
答案 0 :(得分:1)
模型绑定器将创建一个BaseClass对象并尝试分配属性。
因此,当控制进入你的post动作时,它将在BaseClass上有实例而不是子类。
因此,它在向下投射时抛出异常。
当要求BaseClass实例时,可以通过CustomModelBinder和DerievedClass上的Create Instance实现您的需求。
我已经回复了类似的帖子,并有完整的描述。
请查看“MyPost”。这可能就是您要找的内容。