Настройка макета в ActionFilterAttribute.OnAction Выполнено является проблематичным
Я пытаюсь установить путь макета в пользовательском ActionFilterAttribute
, который я написал следующим образом:
public class LayoutInjecterAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
var result = filterContext.Result as ViewResult;
if (result != null)
{
result.MasterName = "~/Views/Layouts/Test.cshtml"
}
}
}
Здесь Test.cshtml представляет собой предварительно скомпилированное представление (с помощью RazorGenerator
) в другом проекте.
Но это дает мне ошибку:
Вид "Индекс" или его мастер не был найден, или механизм просмотра не поддерживает найденные местоположения. Были обысканы следующие местоположения: ~/Views/Home/Index.cshtml ~/Views/Shared/Index.cshtml ~/Views/Home/index.aspx ~/Views/Home/Index.ascx ~/Views/Shared/index.aspx ~/Views/Shared/Index.ascx ~/Views/Макеты/Test.cshtml
и контроллер на самом деле прост:
[LayoutInjecter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
Ответы
Ответ 1
Ошибка показывает, что LayoutInjecter
работает нормально. Вы сказали:
Здесь Test.cshtml представляет собой предварительно скомпилированное представление в другом проекте.
Но. Использование видов бритвы из другого (извне веб-проекта) не поддерживается из коробки. Однако есть инструмент для предварительного компиляции представлений бритвы, а затем вы можете поместить их в любую DLL, которая называется RazorGenerator.
Компилятор не может найти указанный файл основного макета и показывает эту ошибку.
Подробнее см.
Изменить: как PrecompiledMvcViewEngine знал, какой вид рендеринга?
PrecompiledMvcViewEngine
все еще полагается на соглашение с папкой ASP.NET MVC Views, используя относительные пути к файлам для поиска представлений. Однако это немного вводит в заблуждение. PrecompiledMvcViewEngine
не смотрит на физические файлы; он ищет System.Web.WebPages.PageVirtualPathAttribute
, что генератор одиночных файлов Razor добавляет все виды, которые он генерирует, включая путь относительного файла просмотра.
Изменить 2: Я считаю, что руководство по вашей проблеме можно найти в GitHub.
Ответ 2
Это работает. Убедитесь, что путь макета "~/Views/Layouts/Test.cshtml"
верен.
Кроме того, убедитесь, что "Test.cshtml" - это страница макета, а не представление/частичный вид.
Ответ 3
Измените result.MasterName = "~/Views/Layouts/Test.cshtml"
на result.MasterName ="~/Views/Shared/Test.cshtml"
.
Структура по соглашениям выглядит в каталоге ~/Views/Shared/в вашем решении asp.net mvc для ваших страниц макета.
Мне кажется, что вы динамически или во время выполнения выбираете главную страницу.