2009-05-29 3 views
0

컨트롤러에서 상속받은 내 자신의 CustomController 기본 클래스를 만들었습니다. 마찬가지로 ViewDataDictionary에서 상속받은 내 자신의 CustomViewData를 만들었습니다. CustomController 클래스에는 CustomViewData를 매개 변수로 사용하는 ctor가 있습니다.확장 컨트롤러의 ViewData 유형 변경

모든 컨트롤러는 CustomController에서 상속 받고 상속 된 CustomViewData를 전달합니다. 이제 컨트롤러에서 this.ViewData를 호출하고 컨트롤러에서 전달 된 뷰 데이터를 가져오고 싶습니다. 현재 (컨트롤러 클래스에서) ViewDataDictionary가 반환됩니다. 그래서 나는 나의 타입 정보를 잃어 버렸다.

내 CustomController 파생 클래스의 ViewData 속성에 내 입력 정보를 포함시킬 수 있습니까?

답변

0

나는 내 목표를 달성하기 위해 몇 가지 방법을 시도했지만 아무도 존재하지 못하는이 추악한 솔루션을 제외하고는 아무 것도 작동하지 않는 것처럼 보였지만 실제로는 못 생겼습니다.
나는 기본적으로 get/set에서 boxing/unboxing을 래핑합니다. 전체 수업 과정에서이 작업을 수행해야합니다. 그래서 내 CommonController는 CommonViewData 인스턴스로이 작업을 수행합니다. 내 AbcController : CommonController는 AbcViewData : CommonViewData에서 CommonViewData 등으로이 작업을 수행합니다. 더 나은 솔루션을 찾을 때까지이 작업을 수행해야합니다.

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

은 Gerardo의 제안을 따라 뭔가를 생각하는 것입니다. 너는 정말로 캐스팅 헤이를 피하려고한다. –

+0

네, 가능하다면 그렇게하지 않을 것입니다. 그러나 상속 된 컨트롤러에서 새 키워드를 사용하여 인스턴스를 만든 다음 customController에서 ViewData의 상태를 변경하면 상태가 상속 된 컨트롤러에 표시되지 않습니다. 새로운 키워드는 기본적으로 이전의 것을 숨기고 (접근하기 어렵지만 여전히 존재합니다), 이제 뷰 데이터의 두 인스턴스가있게 될 것입니다. ContengController.ViewData (CotengViewData)이고 하나는 InheritedController.ViewData (InheritedViewData)입니다. –

+0

그 다음 다른 하나를 호출하십시오. as : customViewData 유형의 CustomViewData 속성입니다. –

1

을 ViewData 속성은 ControllerBase 클래스에 정의되어 있고 당신은 그것을 무시할 수 없습니다,하지만 당신이 할 수 있습니다 :

public class CustomController : Controller { 

    public new CustomViewData ViewData { get; set; } 

} 

을하지만이

Controller c = myCustomControllerInstance; 
CustomViewData cvd = c.ViewData; 
같은 CustomController 인스턴스에 액세스하는 경우, 경고

ViewData 속성의 기본 구현을 사용할 것이므로 코드가 컴파일되지 않으며 ViewDataDictionary 인스턴스가 반환됩니다.

+0

나는 새로운 키워드가 ViewData 변수의 병렬 인스턴스를 만드는 것처럼 보이기 때문에 사용할 수 없다. 달성하기 위해 노력하고있는 일은 실행 전, 일부 필드가 CustomController 클래스로 채워지는 것입니다. –

+0

내가 제안하려고했던 것의 정렬 : 그러나 '새로운'키워드없이. 왜 당신은 CustomViewData 타입에 대한 필드 값을 가질 수 있고 그것을 지연시킬 수 있습니까? –