Динамическое изменение пути макета ViewStart в MVC 3 - PullRequest
5 голосов
/ 07 декабря 2011

В моем проекте MVC есть 2 области, в которых есть Admin и Client, и мне нужно динамически конфигурировать Layout для клиентской части, в файле _ViewStart (в клиенте) будет установлен макет для всей страницы клиента.* Так что, если нам нужно изменить макет клиента, мы можем изменить путь компоновки файла cshtml в файле _ViewStart, верно?Я не могу найти, как изменить внутри файла ViewStart или есть другое решение в этом случае.

Спасибо за вашу помощь:)

Ответы [ 4 ]

11 голосов
/ 07 декабря 2011

Помните, что все, что находится внутри @{ ... }, рассматривается как код .Таким образом, это должно быть просто вопрос размещения условия, чтобы изменить его наследование:

@{
  Layout = "~/Views/Shared/_Layout.cshtml";
  if (User.Current.IsAuthenticated) {
    Layout = "~/Views/Shared/_AdminLayout.cshtml";
  }
}

Хотя вам, вероятно, лучше смотреть на Темы (и иметь тему администратора / пользователя).В качестве альтернативы, вы можете сделать свой _Layout.cshtml умнее и заставить его обрабатывать различные представления в зависимости от условий.

См. Также: MVC3 Razor - есть ли способ изменить расположение в зависимости от запроса браузера

6 голосов
/ 07 декабря 2011

В вашем вопросе недостаточно информации, чтобы предоставить вам полный пример кода.

Но в основном вы можете сделать это

if (InsertIsAdminLogicHere) {
     Layout = "~/Views/Shared/_AdminLayout.cshtml";
} else {
     Layout = "~/Views/Shared/_Layout.cshtml";
}

Если вы покажете нам, как вы определяете администратора или нет, мы можем предоставить дополнительную помощь.

надеюсь, что это поможет

0 голосов
/ 23 июня 2017

в Views / _ViewStart.cshtml

@{    
object multiTenant;
if (!Request.GetOwinContext().Environment.TryGetValue("MultiTenant", out multiTenant))
{
    throw new ApplicationException("Could not find tenant");
}
Layout = "~/Views/"+ ((Tenant)multiTenant).Name + "/Shared/_Layout.cshtml";
}
0 голосов
/ 15 ноября 2016

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

public class ControllerBase : Controller
{
    public ControllerBase()
    {
        ViewBag.Theme = "~/Views/Shared/Default/Views/_Layout.cshtml";
    }
}

public class HomeController : ControllerBase
{
    public ActionResult Index()
    {

        return View();
    }
}

_ViewStart.cshtml (не вносите никаких изменений в этот файл)

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

Views / Shared / _Layout.cshtml Это файл макета по умолчанию для Asp.NET Mvc. Очистите это и замените эти строки.

@{ 
    Layout = ViewBag.Theme;
}

@RenderBody()

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

Кстати, если вы хотите разместить свои представления вне папки поиска ~ / Views для ThemeableRazorViewEngine

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