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

Настройка макета в 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();
    }
}
4b9b3361

Ответ 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 для ваших страниц макета. Мне кажется, что вы динамически или во время выполнения выбираете главную страницу.