Как динамически менять темы и _Layout в ASP.Net MVC4 - PullRequest
0 голосов
/ 16 февраля 2012

Я хочу иметь возможность изменять представление _Layout.cshtml на основе настроек в моей базе данных.
Я понимаю, что это, вероятно, выполняется в представлении _ViewStart.cshml.

Я использую EF4.2 и хочу адаптировать решение, которое не будет нарушать какой-либо шаблон проектирования.

Не знаю, как это сделать в MVC.

В веб-формах я мог былегко сделать это в коде для главной страницы.

Я делаю что-то вроде этого в моем базовом контроллере:

public abstract class BaseController : Controller
{
    private IUserRepository _userRepository;


    protected BaseController()
        : this(
            new UserRepository())
    {
    }


    public BaseController(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

Я также посмотрел на источник FunnelWeb, но я невполне понимаю, как они вводят вещи ..

Ответы [ 2 ]

3 голосов
/ 22 августа 2012

Старый вопрос, но для всех, кто сталкивался с этим вопросом, вот отличное решение с использованием атрибутов фильтров действий

public class LoadUserLayoutAttribute : ActionFilterAttribute
{
    private readonly string _layoutName;
    public LoadUserLayoutAttribute()
    {
        _layoutName = MethodToGetLayoutNameFromDB();
    }

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

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

    [LoadUserLayout]
    public abstract class BaseController : Controller
    {
       ...
    }
2 голосов
/ 08 мая 2015

Добавьте этот код в метод RegisterBundles класса BundleConfig.Обратите внимание, что я создаю отдельный пакет для каждого CSS, чтобы не отображать каждый CSS клиенту.Я могу выбрать, какой пакет я хочу визуализировать в разделе HEAD общего представления _Layout.cshtml.

bundles.Add(new StyleBundle("~/Content/Ceruleancss").Include(
    "~/Content/bootstrapCerulean.min.css",
        "~/Content/site.css"));

bundles.Add(new StyleBundle("~/Content/defaultcss").Include(
              "~/Content/bootstrap.min.css",
              "~/Content/site.css"));

Затем поместите некоторую логику в shared_Layout.cshtml, чтобы отобразить соответствующий пакет.Так как это представление макета срабатывает для каждой страницы, это хорошее место, чтобы поместить его.

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - Contoso University</title>

@{

    if (HttpContext.Current.User.Identity.Name == "MARK")
    {
        @Styles.Render("~/Content/defaultcss");
    }
    else
    {
        @Styles.Render("~/Content/Ceruleancss");
    }

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