如何在ASP.Net MVC4中动态更改主题和_Layout

时间:2012-02-16 03:18:40

标签: asp.net-mvc entity-framework-4 themes

我希望能够根据数据库中的设置更改_Layout.cshtml视图 我知道它可能是在_ViewStart.cshml视图中完成的。

我正在使用EF 4.2,并希望采用不会破坏任何设计模式的解决方案。

不确定如何在MVC中执行此操作。

在网络表单中,我可以在母版页的代码隐藏中轻松完成此操作。

我在我的基本控制器中做了类似的事情:

public abstract class BaseController : Controller
{
    private IUserRepository _userRepository;


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


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

我也看过FunnelWeb来源,但我不太了解它们是如何注入的......

2 个答案:

答案 0 :(得分:3)

旧问题,但对于遇到此问题的任何人来说,使用动作过滤器属性

是一个很好的解决方案
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
    {
       ...
    }

答案 1 :(得分:2)

将此代码添加到BundleConfig类的RegisterBundles方法中。请注意,我正在为每个css创建一个单独的包,这样我就不会将每个css呈现给客户端。我可以在共享_Layout.cshtml视图的HEAD部分中选择要呈现的包。

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");
    }

}