Что такое базовый класс Razor View в ASP.NET MVC3

Я пытаюсь наследовать все мои представления из пользовательского класса, чтобы я мог добавлять определенное поведение и значения ко всем страницам, но у меня возникают некоторые проблемы. Я попытался подклассифицировать System.Web.Mvc.WebViewPage, но я вынужден выполнить процедуру Execute, которую я не знаю, что она должна делать. Кроме того, если я пытаюсь получить доступ к переменной Context, я получаю нулевую ссылку (действительно странно). Это заставляет меня думать, что у меня может быть неправильный базовый класс....

Любые мысли?

Ответы

Ответ 1

Diego, System.Web.Mvc.WebViewPage - это правильный базовый тип (и вы должны иметь другой класс, наследующий от System.Web.Mvc.WebViewPage<TModel>, если вы хотите строго типизированные представления). Вы должны пометить свой собственный класс как abstract, чтобы не принудительно реализовать метод Execute.

Обновление:. Чтобы настроить все ваши представления для использования вашего собственного базового класса, просмотрите файл ~\Views\Web.config. Внутри него есть раздел, специфичный для Razor, где вы можете использовать атрибут pageBaseType для настройки вашего настраиваемого типа.

Что касается свойства Context, он должен быть полностью инициализирован после выполнения представления. Однако он может быть недоступен, если вы попытаетесь получить доступ к нему слишком рано (например, от вашего конструктора классов). Когда вы пытаетесь получить к нему доступ?


Метод Execute - это то, что предоставляется компилятором Razor при компиляции вашего представления. Например, учитывая следующий файл вида

Hello @Name!

Компилятор Razor за кулисами генерирует следующий класс (это упрощение, поэтому детали могут быть отключены, но он должен передать точку)

public class _Some_Generated_Class_Name_ : System.Web.Mvc.WebViewPage {
  public void Execute() {
    Write("Hello ");
    Write(Name);
    Write("!");
  }
}

Затем фреймворк вызывает метод Execute в вашем классе вида и ваше представление будет выполнено.