MVC 5 Change ViewEngine Path Error: (должен быть производным от ViewPage) даже с WebConfig в View Root

Я пытаюсь переместить мой каталог по умолчанию просмотров по другому пути.

Я изменил свой Global.asax, чтобы добавить каталог в моем представлении Engine, как это

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        RegisterViewEngines(ViewEngines.Engines);
    }

    private static void RegisterViewEngines(ICollection<IViewEngine> engines)
    {
        engines.Add(new WebFormViewEngine
        {
            //MasterLocationFormats = new[] { "~/App/Views/Admin/{0}.master" },
            PartialViewLocationFormats = new[] { "~/Mvc/Views/Shared/{1}/{0}.cshtml" },
            ViewLocationFormats = new[] { "~/Mvc/Views/{1}/{0}.cshtml" }
        });
    }

Это образ моей новой конфигурации папки

Каждый раз, когда я читаю, я вижу, что мне нужно добавить веб-конфигурацию в мою корневую папку Views. Поэтому я беру тот, который пришел в шаблоне View, и вставляю его в мою новую конфигурацию папки.

Это мой /Mvc/Views/Web.Config

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <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="Template" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

  <appSettings>
    <add key="webpages:Enabled" value="false" />
  </appSettings>

  <system.webServer>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>

  <system.web>
    <compilation>
      <assemblies>
        <add assembly="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
  </system.web>
</configuration>

Нет, что я всегда вижу эту ошибку:

Трассировка стека ошибок

Представление в ~ ~ Mvc / Views / Login / Index.cshtml должно быть производным от ViewPage, ViewPage , ViewUserControl или ViewUserControl .

Описание: исключение, не представляющее лучший продукт в настоящий момент в Интернете. Контролируемые данные и информация о происхождении и коде происхождения.

Подробности исключения: System.InvalidOperationException: представление в ~ ~ /Mvc/Views/Login/Index.cshtml должно происходить из ViewPage, ViewPage , ViewUserControl или ViewUserControl .

1 ответ

Я нашел свое решение, проблема была в моей функции RegisterViewEngine.

Я использую класс WebFormViewEngine, который предполагается использовать для файла.ascx. для представления Razor вы должны использовать класс RazorViewEngine

Так что я просто должен изменить свою функцию следующим образом:

    private static void RegisterViewEngines(ICollection<IViewEngine> engines)
    {
        engines.Add(new RazorViewEngine
        {
            //MasterLocationFormats = new[] { "~/App/Views/Admin/{0}.master" },
            PartialViewLocationFormats = new[] { "~/Mvc/Views/Shared/{1}/{0}.cshtml" },
            ViewLocationFormats = new[] { "~/Mvc/Views/{1}/{0}.cshtml" }
        });
    }

Теперь это работает отлично!

Другие вопросы по тегам