2012-02-16 65 views
0

我希望能够根据数据库中的设置更改_Layout.cshtml视图。
据我所知,它可能是在_ViewStart.cshml视图中完成的。如何在ASP.Net中动态更改主题和_Layout MVC4

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

不知道如何去做这个在MVC。

在web表单中,我可以很容易地在masterpage的代码隐藏中做到这一点。

我做这样的事情在我的基本控制器:

public abstract class BaseController : Controller 
{ 
    private IUserRepository _userRepository; 


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


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

我在FunnelWeb源看起来很好,但我不完全得到他们是如何注入东西..

+0

将它传递给ViewBag。添加这个ViewStart,ViewContext.Controller.ViewBag.Layout。 – user960567 2012-02-16 04:04:06

+1

为主题,你可以看看这个现场演示:http://prodinner.aspnetawesome.com并在这里下载http://prodinner.codeplex.com – Omu 2012-02-16 10:42:52

回答

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

}