Как использовать общий _ViewStart в областях?

В моей папке "root" Views у меня есть _ViewStart со следующим кодом:

@Code
    Layout = "~/Views/Shared/_Layout.vbhtml"
End COde

В моей папке Area/Public/Views у меня есть копия моего _ViewStart из корневой папки Views.

Но когда я запускаю код, я получаю эту ошибку:

Unable to cast object of type 'ASP._ViewStart_vbhtml' to type 'System.Web.WebPages.StartPage'.

Я не знаю, что я делаю неправильно?

Можно ли использовать один _ViewStart.vbhtml для моих областей?

Как использовать _ViewStart.vbhtml в областях?

Ответ 1

Вам нужно скопировать файл ~\Views\Web.config (или, по крайней мере, следующие элементы конфигурации) в свой веб-просмотр Area.Config:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.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=3.0.0.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.Routing" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

Ответ 2

Когда я столкнулся с этой проблемой, я сначала наткнулся на этот ответ, но то, что я действительно хотел, было http://stevescodingblog.co.uk/asp-net-mvc-3rc-areas-viewstart/.

Суть проблемы заключается в том, что _ViewStart. ** html имеет область видимости. Он будет применяться ко всем представлениям, которые находятся на том же уровне или в подпапках под ним. Поэтому, если вы переместите его в базовый каталог (например, рядом с файлом Global.asax), он будет применяться ко всем представлениям под ~/Views/* и всеми видами в ~/Areas/*/Просмотры/*.

Как и в принятом ответе, вам все равно придется копировать разделы <system.web.webPages.razor> и <sectionGroup name="system.web.webPages.razor"..>. Поместите их в свой базовый файл web.config(в корень проекта).

Здесь более полное руководство.

Для бонусных точек вы можете переопределить настройки _ViewStart. ** html, создав новый файл ближе к рассматриваемому представлению (например, файл ~/Views/_ViewStart.cshtml перезапишет ~/_ViewStart.cshtml для всех просмотров в каталог ~/Views/).

Ответ 3

Я обнаружил, что перемещение _ViewStart в корневой каталог и добавление раздела system.web.webPages.razor в корневую веб-конфигурацию работало, однако мне также нужно было добавить ряд строк, подобных этому & Л; < add namespace = "Ico.Logics.Web.Areas.Admin.Models" / → в скопированный раздел.