【问题标题】:Asp.net MVC change css on publishAsp.net MVC 在发布时更改 css
【发布时间】:2016-07-25 08:09:14
【问题描述】:

我们有一个 MVC 应用程序,它在生产中部署为 3 个不同的版本(独立的业务领域需要独立的 DB 和 UI)。唯一的问题是少数用户使用超过 1 个这些应用程序,并且因为它们看起来很相似,所以人们会混淆他们使用的是哪一个。

我使用 web.config 转换来更改应用程序标题,但我想做的是为每个应用程序提供不同的 css 文件。有没有办法:

在发布时使用转换来编辑现有的 css 文件? 或者 在发布时将 css 文件交换为另一个?

任何能指引我正确方向的帮助都会很棒。 谢谢

【问题讨论】:

  • 但是应用程序生成的 HTML 没有不同的类、ID 等?
  • 是的,两个应用程序的 Html 将尽可能相同,以尽量减少维护。
  • 很想知道为什么我投了反对票?
  • 我只是在猜测,但我认为您的反对意见来自那些认为拥有同一网站的多个版本的设计决策是一个坏主意的人。如果您考虑使用单个站点的替代方案,请查看我的答案。
  • 谢谢,很高兴有线索。如果他们对此发表评论,我很乐意与他们讨论设计决策,但并非我们所有人都生活在一个他们可以使用“干净”解决方案的世界中。

标签: css asp.net asp.net-mvc


【解决方案1】:

我在类似的情况下做了什么:我动态地将一个类放在主体 <body class="theme-site@AppSettingParam"> 上,我只有一个带有覆盖的 CSS:

.theme-site1 { background-color:blue; }
.theme-site2 { background-color:red; }

如果用户使用多个站点,它不会重新下载 css,我只有一个 css 需要维护。

【讨论】:

    【解决方案2】:

    不是您现在正在寻找的答案,但是如果您确实重新考虑使用具有不同配置的同一站点,请查看我最近为动态更改 CSS 等所做的工作:

    我决定网站的每个“版本”都将在查询字符串中使用唯一的引用。基于此,我会找到正确的内容,将路径加载到模型中并将其发送到视图。

    这是控制器:

    public ActionResult Index()
            {
                List<string> listOfAcceptableRef = new List<string>() { "uniqueCode1", "uniqueCode2" };
                string uniqueRef=null;
                if (Request.QueryString["ref"]!=null)
                    policyRef = Request.QueryString["ref"].ToLower();
                if (string.IsNullOrWhiteSpace(uniqueRef) || (!string.IsNullOrWhiteSpace(uniqueRef) && !listOfAcceptableRef.Contains(uniqueRef)))
                {
                    throw new Exception("This reference key is unknown.");
                    //return RedirectToAction("KeyError");
                }
                return View(GetPageContext(uniqueRef));
            }
    

    从查询字符串中获取参考代码,然后从上下文工厂生成一个包含相关 CSS 路径的模型。

    这是我的模型:

    public class PageContext
        {
            public string Ref { get; set; }
            public string TabId { get; set; }
            public string TabName { get; set; }
            public string SiteTitle { get; set; }
            public string CssPath { get; set; }
    
            public PageContext()
            {
                Products = new List<ProductInfo>();
            }
        }
    

    还有我的上下文工厂:

    public class ContextFactory<T>
        {
            private ContextFactory()
            {
    
            }
    
            static readonly Dictionary<string, Type> _dict = new Dictionary<string, Type>()
                {
                    { "uniqueRef1", Type.GetType("The.Full.Page.Namespace.UniqueSite1Context")},
                    { "uniqueRef2", Type.GetType("The.Full.Page.Namespace.UniqueSite2Context")}
                };
    
            public static bool Create(string reference, out T context)
            {
                context = default(T);
                Type type = null;
                if (_dict.TryGetValue(reference, out type))
                {
                    context = (T)Activator.CreateInstance(type);
                    return true;
                }
                return false;
            }
        }
    

    以及带有 CSS 路径等的实际上下文实例:

    public class UniqueSite1Context : PageContext
        {
            public UniqueSite1Context()
            {
                this.Ref = "uniqueSite1";
                this.CssPath = "Content/UniqueSite1Context.css";
                this.DisclaimerPath = "Content/UniqueSite1Context.pdf";
                this.SiteTitle = "UniqueSite1";
    
            }
        }
    

    毕竟,只需使用模型的路径渲染 CSS:

    @section Styles {
        @{
            string path = Url.Content("~") + Model.CssPath;
    
            <link href="@path" rel="stylesheet" type="text/css" />
        }
    }
    

    从架构上讲,您可以扩展它(或者更确切地说是它的概念)以根据用户访问的“站点”使用不同的逻辑和数据上下文。

    【讨论】:

    • 就像您在那里所做的一样,但在这种情况下重复使用同一个站点并不是一个真正的选择。
    【解决方案3】:

    您考虑过转换文件吗?当您发布时,它们会根据所选的发布配置文件更改您的 web.config 文件中的设置。通常默认情况下可用的配置文件是“Debug”和“Release”,但您可以使用不同的 CSS 路径添加更多类似“Site1”和“Site2”的配置文件。

    Take a look at how they work here.(我自己没用过,所以对代码示例帮不上什么忙)。

    【讨论】:

    • 是的,我已经使用转换文件来更改站点名称和数据库。我在想我们将它们与 Tonios 答案结合使用。所以我们在配置中得到不同的设置,并基于它显示不同的 css 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2017-01-18
    相关资源
    最近更新 更多