在扩展控制器中更改ViewData的类型

时间:2009-05-29 12:23:41

标签: c# c asp.net-mvc

我创建了自己的CustomController基类,它继承自Controller。 同样,我创建了自己的ViewViewData,它继承自ViewDataDictionary。 CustomController类有一个ctor,它接受CustomViewData作为参数。

我的所有控制器都继承自CustomController并传入其继承的CustomViewData。 现在我希望能够从我的控制器中调用this.ViewData并获取我在控制器中传递的视图数据。目前我得到一个ViewDataDictionary(来自Controller类)。所以我丢失了我的类型信息。

如何在我的CustomController派生类中保留我的ViewData属性的类型信息,而不将其包装在为我做拳击的get / set中?

2 个答案:

答案 0 :(得分:1)

ViewData属性在ControllerBase类中定义,您无法覆盖它,但您可以这样做:

public class CustomController : Controller {

    public new CustomViewData ViewData { get; set; }

}

但是要注意,如果你像这样访问一个CustomController实例

Controller c = myCustomControllerInstance;
CustomViewData cvd = c.ViewData;

您的代码将无法编译,因为您将使用ViewData属性的默认实现,它将返回一个ViewDataDictionary实例。

答案 1 :(得分:0)

我尝试了几种方法来实现我的目标,但除了我知道存在的这个丑陋的解决方案之外,似乎没有任何方法可行。但是......好吧,丑陋。
我基本上将装箱/拆箱包装在一个get / set中。我必须在整个课程链中这样做。所以我的CommonController使用CommonViewData实例,我的AbcController:CommonController从AbcViewData执行此操作:CommonViewData到CommonViewData等。 直到我找到一个更好的解决方案,我将不得不这样做。

public new AbcViewData ViewData { 
    get { return base.ViewData as [bcViewData; }
    set { base.ViewData = value; }
}