Как указать разные макеты в файле ViewStart для бритвы ASP.NET MVC 3? - PullRequest
307 голосов
/ 02 марта 2011

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

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

  • PublicController
  • StaffController

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

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

Как я могу использовать файл _ViewStart.cshtml, чтобы указать, что все View / Action в «Public» используют PublicLayout, а все в «Staff» использует StaffLayout?

Спасибо!

Ответы [ 3 ]

548 голосов
/ 02 марта 2011

Вы можете поместить файл _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();
}
29 голосов
/ 21 февраля 2015

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

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

Другие способы сделать можно найти здесь , надеюсь, это кому-нибудь поможет.

14 голосов
/ 08 октября 2014

Этот метод - самый простой способ для начинающих управлять рендерингом макетов в приложении ASP.NET MVC.Мы можем идентифицировать контроллер и визуализировать макеты как контроллер par, для этого мы можем записать наш код в файл _ViewStart в корневом каталоге папки Views.Ниже приведен пример, показывающий, как это можно сделать.

  @{
             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"

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