Как указать различные макеты в файле ViewStart бритвы ASP.NET MVC 3?

Я хотел бы иметь 2 отдельных макета в моем приложении. Скажем, один из них относится к публичному разделу веб-сайта, а другой относится к стороне участника.

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

  • PublicController
  • StaffController

И каждый из них имеет соответствующий макет для всех представлений под каждым.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

Как использовать файл _ViewStart.cshtml, чтобы указать, что все View/Action в разделе "Public" используют PublicLayout, а все в разделе "Персонал" используют StaffLayout?

Спасибо!

Ответ 1

Вы можете поместить файл _ViewStart.cshtml внутри папки /Views/Public, который переопределит значение по умолчанию в папке /Views и укажите желаемый макет:

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

По аналогии вы можете поместить еще один файл _ViewStart.cshtml в папку /Views/Staff с помощью:

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

Вы также можете указать, какой макет следует использовать при возврате представления внутри действия контроллера, но для каждого действия:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

Еще одна возможность - это настраиваемый фильтр действий, который переопределяет макет. Как вы можете видеть много возможностей для достижения этого. Вы можете выбрать, какой из них лучше всего подходит в вашем сценарии.


UPDATE:

В соответствии с запросом в разделе комментариев здесь приведен пример фильтра действий, который выбирает главную страницу:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

а затем украсить контроллер или действие с помощью этого настраиваемого атрибута, определяющего требуемый макет:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}

Ответ 2

Еще один метод - определить макет внутри представления:

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

Больше способов сделать, можно найти здесь, надеюсь, что это поможет кому-то.

Ответ 3

Этот метод является самым простым способом для новичков контролировать рендеринг макетов в вашем приложении ASP.NET MVC. Мы можем идентифицировать контроллер и отображать макеты как парсер, чтобы сделать это, мы можем написать наш код в файле _ViewStart в корневом каталоге папки "Представления". Ниже приведен пример того, как это можно сделать.

  @{
             var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
             string cLayout = "";
            if (controller == "Webmaster") {
                  cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
                 }
               else {
                cLayout = "~/Views/Shared/_Layout.cshtml";
               }
        Layout = cLayout;
         }

Прочитайте полную статью здесь "Как визуализировать различные макеты в ASP.NET MVC"