Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改扩展控制器中ViewData的类型_C#_C_Asp.net Mvc - Fatal编程技术网

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

C# 更改扩展控制器中ViewData的类型,c#,c,asp.net-mvc,C#,C,Asp.net Mvc,我创建了自己的CustomController基类,该基类继承自Controller。 同样,我创建了从ViewDataDictionary继承的自定义ViewData。 CustomController类有一个接受CustomViewData作为参数的ctor 我的所有控制器都继承自CustomController并传入其继承的CustomViewData。 现在,我希望能够从控制器中调用this.ViewData,并获取在控制器中传入的视图数据。目前,我(从控制器类)返回了一个ViewDat

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

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


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

ViewData属性在ControllerBase类中定义,您不能重写它,但可以执行以下操作:

public class CustomController : Controller {

    public new CustomViewData ViewData { get; set; }

}
但是请注意,如果您访问这样的CustomController实例

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

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

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

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

我担心我不能使用new关键字,因为它似乎是ViewData变量的并行实例。我想做的是,在执行操作之前,我的一些字段由CustomController类填充。这有点像我想建议的:但是没有“new”关键字。为什么可以为CustomViewData类型设置一个字段值并对其进行lazy初始化呢?我认为应该遵循Gerardo的建议。你真的想避免扮演海耶斯,如果我可以,我不会这么做。但是,当我使用new关键字在继承的控制器中创建一个实例,然后在customController中更改ViewData的状态时,该状态不会在继承的控制器中表示。新关键字基本上隐藏了前一个关键字(使其无法访问,但仍然存在),因此现在将有两个viewdata实例。ContengController.ViewData(是CotengViewData)和InheritedController.ViewData(是InheritedViewData)中的一个。然后将您的自定义数据称为其他数据?如:CustomViewData类型的属性CustomViewData中所示。此时仍会有一个重复的字段,对吗?我希望它基本上是变量的一个实例。A最深的级别将作为最复杂的类型处理,在上一级别将作为CustomViewData处理,然后在上一级别将作为ViewDataDictionary处理。所有实例都是相同的。不幸的是,对于重复的ViewData实例没有什么可做的。正如我在前面的回答中提到的,该属性是不可重写的,因此您必须创建一个新属性(带有一个新的内部字段)或“新建”旧属性,并使用一个新字段存储其值。您还可以创建一个全新的控制器,直接实现IController,但这意味着您基本上必须重写ControllerBase。