Подтвердить что ты не робот

Изменение типа базового вида на MVC4

Я прочитал сообщение об изменении типа базового вида в MVC по ссылке ниже:

http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx

Я следил за инструкциями, но моя страница все еще наследуется от System.Web.Mvc.WebViewPage. Я не могу получить какое-либо свойство, определенное в моей настраиваемой базе представлений, и я получаю сообщение об ошибке во время выполнения. Когда я использую ключевое слово @inherits, оно исправляется.

Web.config

<pages pageBaseType="[MyNamespace].WebViewPageBase">
  <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
  </namespaces>
</pages>

WebViewPageBase

public class WebViewPageBase : WebViewPage
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = { foo };
    }

    public override void Execute()
    {

    }
}


public class WebViewPageBase<T> : WebViewPage<T>
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = { foo };
    }

    public override void Execute()
    {

    }
}

Частичный вид

@model TopMenuModel

<div class="topMenu">
@MyProperty
</div>

Но в записи, которую я прочитал, нет инструкции по ключевому слову @inherits. Есть ли что-то, что я пропустил, или любой способ сделать эту работу без ключевого слова @inherits на всех страницах?

РЕШИТЬ:

web.config файл в каталоге root неверен. Я изменил базовый тип в файле web.config в каталоге View и исправил его.

4b9b3361

Ответ 1

Почему вы показали две версии WebViewPageBase: generic и non-generic?

Вам нужна только общая версия:

public class MyWebView<T> : WebViewPage<T>
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = new SomeType();
    }

    public override void Execute()
    {
    }
}

а затем:

<pages pageBaseType="MvcApplication1.WebViews.MyWebView">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
  </namespaces>
</pages>

Теперь в ваших представлениях вы сможете использовать свойство:

@model TopMenuModel

<div class="topMenu">
    @MyProperty
</div>

UPDATE:

Пошаговая настройка:

  • Создайте новое приложение ASP.NET MVC 3 с помощью шаблона Интернета
  • Добавить пользовательский базовый вид:

    namespace MvcApplication1
    {
        public class MyWebView<T> : WebViewPage<T>
        {
            public string MyProperty { get; set; }
    
            public override void InitHelpers()
            {
                base.InitHelpers();
                MyProperty = "Hello World";
            }
    
            public override void Execute()
            {
            }
        }
    }
    
  • Установите атрибут pageBaseType в ~/Views/web.config (не путать с ~/web.config):

    <pages pageBaseType="MvcApplication1.MyWebView">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
    
  • Внутри ~/Views/Home/Index.cshtml используйте свойство:

    <div>
        @MyProperty
    </div>
    
  • Нажмите Ctrl+F5, чтобы запустить приложение, и если все будет хорошо, вас встретит Hello World.

Ответ 2

Проблема, с которой вы сталкиваетесь, заключается в том, что вам необходимо изменить файл web.config папки VIEWS. Итак, в основном эта строка:

 <pages pageBaseType="[MyNamespace].WebViewPageBase">

должен находиться в файле web.config из вашей папки просмотра, а не в основном проекте web.config. Ответ Дарина Димитрова четко указывает на это, но люди обычно не замечают этой детали. Я знаю, потому что я был одним из них. На самом деле статья Фила Хаака...