2009-05-29 3 views
0

Я создал свой собственный базовый класс CustomController, который наследуется от Controller. Аналогичным образом я создал свою собственную CustomViewData, которая наследуется от ViewDataDictionary. Класс CustomController имеет ctor, который принимает параметр CustomViewData как.Изменить вид ViewData в расширенном контроллере

Все мои контроллеры наследуют от CustomController и передают их унаследованные CustomViewData. Теперь я хочу иметь возможность вызвать this.ViewData из моего контроллера и вернуть данные просмотра, которые я передал на контроллере. В настоящее время я возвращаю ViewDataDictionary (из класса Controller). Поэтому я потерял информацию о типе.

Как сохранить информацию о типе в моем представлении ViewData в моем производном классе CustomController, не обернув его в get/set, который делает для меня бокс?

ответ

0

Я пробовал несколько способов достижения своей цели, но никто, кажется, не работает, кроме этого уродливого решения, которое я знал, но есть .. ну, уродливо.
Я в основном обертываю бокс/unboxing в get/set. Я должен делать это во всей цепочке классов. Таким образом, мой CommonController делает это с экземпляром CommonViewData, мой AbcController: CommonController делает это из AbcViewData: CommonViewData в CommonViewData и т. Д. Пока я не найду лучшее решение, мне придется пойти с этим.

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

думает, что что-то похожее на предложение Херардо - это путь. вы действительно хотите избежать кастинга эй –

+0

Да, если бы я мог, я бы этого не сделал. Но когда я создаю экземпляр в наследуемом контроллере с новым ключевым словом, а затем изменяю состояние ViewData в customController, состояние не отображается в наследуемом контроллере. Новое ключевое слово в основном скрывает предыдущий (делает его недоступным, но все еще существует), поэтому теперь будут два экземпляра viewdata. ContengController.ViewData (это CotengViewData) и один в InheritedController.ViewData (это InheritedViewData). –

+0

Назовите свой пользовательский еще что-нибудь еще? как в: свойство CustomViewData типа CustomViewData. –

1

ViewData свойство определяется в классе ControllerBase, и вы не можете изменить его, но вы можете сделать это:

public class CustomController : Controller { 

    public new CustomViewData ViewData { get; set; } 

} 

Но имейте в виду, если вы получаете доступ к экземпляру CustomController как этот

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

ваш код не будет скомпилирован, так как вы будете использовать реализацию свойства ViewData по умолчанию, и он вернет экземпляр ViewDataDictionary.

+0

Я боюсь, что не могу использовать новое ключевое слово, так как оно похоже на параллельный экземпляр переменной ViewData. То, что я пытаюсь выполнить, состоит в том, что прежде чем действие будет выполнено, некоторые из моих полей заполняются классом CustomController. –

+0

вот что я хотел бы предложить: но без «нового» ключевого слова. почему у вас есть значение поля для вашего типа CustomViewData и lazy-init? –

Смежные вопросы