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" } }); }
Теперь это работает отлично!