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

Не удалось найти страницу макета "{path}"

Мы только что получили новый сервер Windows 2008 R2, и я пытаюсь настроить сайт MVC 3 в IIS 7.5 с помощью Razor View Engine. Я получаю странную ошибку, когда я получаю доступ к маршруту по умолчанию.

Страница макета "~/Views/Shared/_Layout.cshtml" может не может быть найден по следующему пути: "~/Views/Shared/_Layout.cshtml".

Это странно, потому что я явно устанавливаю макет из /views/home/index.cshtml следующим образом:

@{
  Layout = "~/Views/Shared/_Layout.cshtml";
}

Я на 100% уверен, что /views/shared/_layout.cshtml существует в файловой системе. Вот скриншот.

enter image description here

Если я удалю Layout = "~/Views/Shared/_Layout.cshtml"; из моего представления, страница будет отображать содержимое /home/index.cshtml все отдельно (без кода из _Layout.cshtml). Я также попытался установить макет с помощью _ViewStart.cshtml.

Кто-нибудь знает, почему MVC не сможет "найти" файл макета? Этот сайт отлично работает при работе на встроенном веб-сервере для визуальной студии.

Здесь моя трассировка стека:

[HttpException (0x80004005): The layout page "~/Views/Shared/_Layout.cshtml" could not be found at the following path: "~/Views/Shared/_Layout.cshtml".]
   System.Web.WebPages.WebPageExecutingBase.NormalizeLayoutPagePath(String layoutPage) +204956
   System.Web.WebPages.WebPageBase.PopContext() +150
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +384
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +33
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +784900
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +265
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +784976
   System.Web.Mvc.Controller.ExecuteCore() +159
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371
4b9b3361

Ответ 1

Кажется, что у вас, вероятно, есть проблема с разрешениями. С информацией, которую вы указали, кажется наиболее вероятной причиной того, что вы не можете найти файл _Layout.cshtml.

С Server 2008 и IIS 7 пул приложений имеет свой собственный идентификатор, используемый для ACL (с именем IIS AppPool {App Pool Name}), и эти идентификаторы входят в группу IIS_IUSRS. Кроме того, ваш каталог по умолчанию inetpub/wwwroot будет иметь разрешения на чтение для группы IIS_ISRS. Поэтому, если вы не получите требуемые разрешения, я думаю, что пул приложений на самом деле не работает с правильным идентификатором.

Одна из причин, по которой идентификатор может быть неправильным, - это параметр для идентификации пользователя с анонимной аутентификацией. Перейдите в элемент проверки подлинности для сайта (или всего сервера) и отредактируйте правило анонимной аутентификации для запуска в качестве идентификатора пула приложений.

Это немного догадка, но казалось, что у этого парня была почти такая же проблема.

IIS Anonymous Authentication user identity screen

Ответ 2

Как показала qbantek, для меня это связано с тем, что действие сборки файла _layout.cshtml установлено равным none.

причина, по которой он был установлен none, заключается в том, что я начал с пустого шаблона проекта mvc и вручную добавил файл _layout.cshtml в проект.

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

Ответ 3

Эта проблема может иногда возникать при разрешении безопасности. У вас есть разрешение на чтение/запись в папке/файле.

Ответ 4

Моя проблема была в файле .suo, содержавшем старые пути к файлу. Я закрыл VS, удалил свой файл suo, повторно открыл VS, и он отлично работает.