0

出色地,

假设我有两个模型类:

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

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

和一个以 BaseClass 类型为模型的视图。

如果我将 DerivatedClass 传递给视图并通过表单检索信息,它不会再次“可转换”到 DerivatedClass 吗?

问题是,如果我在视图中检索模型的类型 (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 信息后,无论如何要在控制器内部进行此转换?

4

1 回答 1

1

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

因此,当控制权来到您的发布操作时,它将在 BaseClass 上拥有实例而不是子类。

因此,它在向下转换时抛出异常。

当请求 BaseClass 实例时,您的要求可以通过 CustomModelBinder 和在 DerievedClass 上创建实例来实现。

我已经回答了一个类似的帖子,有完整的描述。

请查看MyPost。这可能是您正在寻找的。

于 2012-02-24T09:51:15.513 回答