2015-11-20 1 views
12

Я пытаюсь установить путь компоновки в пользовательской ActionFilterAttribute я написал следующим образом:Настройка макета в ActionFilterAttribute.OnActionExecuted проблематично

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) в другом проекте.

Но это дает мне ошибку:

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/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/Layouts/Test.cshtml

и контроллер на самом деле прост:

[LayoutInjecter] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 
+0

Вы создали контрольные макеты? –

+0

Нет, нет контроллера с именем 'Layouts' – Kaan

+0

. Добавьте новый контроллер под названием layouts, а затем создайте новый результат действия Test и верните представление, и это должно быть работа –

ответ

4

Он работает. Убедитесь, что путь макета "~/Views/Layouts/Test.cshtml" верен.

Кроме того, убедитесь, что «Test.cshtml» - это страница макета, а не вид/частичный вид.

+0

Путь верен, и Test.chstml - это просто макетная страница. – Kaan

7

Ошибка показывает, что LayoutInjecter работает нормально. Вы сказали:

In here Test.cshtml is precompiled view in a different project.

Но, используя взгляды бритвенных от другой (со стороны веб-проекта) не поддерживается из коробки. Однако есть инструмент для предварительной компиляции представлений бритвы, а затем вы можете поместить их в любую DLL, которая называется RazorGenerator. Компилятор не может найти указанный файл основного макета и показывает эту ошибку.

Для получения дополнительной информации смотрите на

Edit: Как же PrecompiledMvcViewEngine знать, какой вид для визуализации?

PrecompiledMvcViewEngineвсе еще полагается на папку Просмотров конвенции ASP.NET MVC, используя относительные пути к файлам, чтобы найти точку. Однако это немного вводит в заблуждение. PrecompiledMvcViewEngineне рассматривает физические файлы; он ищет System.Web.WebPages.PageVirtualPathAttribute, что генератор одиночных файлов Razor добавляет к каждому представлению, которое он генерирует, включая относительный путь к файлу.

Редактировать 2: Я считаю, что руководство по вашей проблеме можно найти в GitHub.

+0

Я действительно сделал это с RazorGenerator. – Kaan

+0

@Kaan Я разместил редактирование на своем ответ. Не могли бы вы проверить, появлялись ли сгенерированные файлы в каталоге 'obj' вашего проекта и что компилируются представления в вашу сборку проекта? –

+0

Я не знаю, почему, но если оба проекта находятся в одном решении, это работает Но если они находятся в отдельном решении, это не сработает! – Kaan

3

Изменить result.MasterName = "~/Views/Layouts/Test.cshtml"result.MasterName ="~/Views/Shared/Test.cshtml". Структура по соглашениям выглядит в каталоге ~/Views/Shared/в вашем решении asp.net mvc для ваших страниц макета. Мне кажется, что вы динамически или во время выполнения выбираете главную страницу.

+0

Do Я получаю щедрость? –