首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在_Layout中动态更改主题和ASP.Net MVC4

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

Stack Overflow用户
提问于 2012-02-16 03:18:39
回答 2查看 2.9K关注 0票数 1

我希望能够根据数据库中的设置更改_Layout.cshtml视图。

据我所知,这可能是在_ViewStart.cshml视图中完成的。

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

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

在web表单中,我可以很容易地在主页的代码背后完成这个任务。

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

代码语言:javascript
复制
public abstract class BaseController : Controller
{
    private IUserRepository _userRepository;


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


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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-22 13:53:01

老问题,但是对于任何遇到这个问题的人,这里有一个很好的解决方案,使用Action属性

代码语言:javascript
复制
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; 
        }
    }
}

然后,可以使用以下自定义属性向基本控制器(或操作)添加一个属性:

代码语言:javascript
复制
    [LoadUserLayout]
    public abstract class BaseController : Controller
    {
       ...
    }
票数 3
EN

Stack Overflow用户

发布于 2015-05-08 15:27:37

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

代码语言:javascript
复制
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中添加一些逻辑来呈现适当的包。因为这个布局视图为每个页面触发,所以这是一个放置它的好地方。

我认为这种方法可以用于品牌,如果您支持多个团队为您的应用程序。我认为,它还可以通过用户提供自定义样式。

代码语言:javascript
复制
<!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");
    }

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9305064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档