我认为我有一个特殊的情况,需要一些建议。我目前有一个C#MVC Web应用程序,我们正在将其重新命名为其他人群。大多数功能将保持不变,但是用户登录时所显示的颜色,图形和初始索引页面会有所不同。我已经在网络应用程序中使用Area进行了研究,但不确定是否最好的解决方案。
目标是此时不必复制Web应用程序,不必根据正在使用的Web应用程序版本加载不同的样式表,并且还可以共享一些基本样式表,而且大多数视图也需要共享。我想尽可能减少代码重复量。
答案 0 :(得分:1)
我认为这种情况并不像您想象的那样独特,这是一个非常老的问题(还记得MySpace页面吗?:P),但是这里有一些要解决的问题。
第一个是如何更改颜色和图形。通过切换出样式表,更改颜色将非常简单。您将遇到的问题是,要么将不得不复制整个样式表(这将是一场噩梦,要么要维护它们),或者将颜色分离到自己的样式表中(这对于开发来说很尴尬)。我很想通过使用诸如SASS或LESS之类的预处理器来组合这两种方法。这些将允许您将颜色定义为变量,并在其他样式表中使用它们。然后,您将编译CSS两次,每种颜色一次。这为您提供了最佳的功能折衷(您仍然可以最小化),易于开发和易于维护。 SASS和LESS在功能集中非常相似。使用哪种选择通常取决于开发者的偏好或第三方库的使用。
对于图形,希望您已经使用background
标签在样式表中定义了它们。如果不是这样,我认为迁移到此策略将是最容易的(假设此方法适用于有关可访问性和功能的图像)。这种方式比在许多地方添加逻辑以在另一幅图像上拾取一张图像要容易得多。
最后,当您登录时更改索引页面时,假设您是基于某些用户设置选择页面,我认为最好的做法是在登录后修改重定向或在页面上添加检查主页以提供不同的视图。如果您在任何地方都有指向主页的链接,则检查主页操作方法可能是最好的方法,因为它将确保每次都提供正确的页面。如果在操作方法中存在用数据填充主页的逻辑,则最好将主页拆分为单独的私有方法:
public IActionResult Index()
{
if (User.IsInRole("CustomisedTheme"))
{
return CustomisedIndex();
}
else
{
return DefaultIndex();
}
}
private IActionResult CustomisedIndex()
{
// Complex logic to populate view
// ...
return View("CustomisedIndex");
}
private IActionResult CustomisedIndex()
{
// Complex logic to populate view
// ...
return View("CustomisedIndex");
}
当然,所有这些都假设您仅使用了几种不同的样式。如果您正在研究可自定义的样式(例如具有自助式自定义界面),那么它将变成一个完全不同的问题,我不再尝试在Stack Overflow上回答:)