我有一个通过Visual Studio的Web部署部署的ASP.NET MVC项目 - 到目前为止一切正常。
我现在需要部署同一项目的另一个版本(例如,针对不同的客户) - 具有相同的代码库/功能,但具有不同的布局,即其他CSS和图像(甚至可能具有不同的视图/ Razor代码) )。理想情况下,其他配置的内容根本不会发布。
我知道我可以为持久层使用不同的连接字符串 - 但有没有办法配置其他内容元素呢?
我希望避免使用需要分支/合并的两个版本(或更高版本) - 而是简单地使用不同的&#34;主题部署最新版本&#34; ... < / p>
答案 0 :(得分:4)
我有一个带有4个类库的MVC项目。我将其部署到其他3个域中。
我只为每个客户端复制了没有控制器或代码类的MVC项目,并将它们添加到我的解决方案中。我只将它们用于视觉变化或主题。不适用于服务器端功能。所以复制的项目&#39;不应该部署组件。只应部署UI文件。程序集从原始MVC项目的输出文件夹进行部署。
我构建解决方案并将dll发布到3个域中,并且只将每个客户端的UI文件发布到它的服务器中。
这使我能够在一个MVC项目中开发服务器端功能。将UI文件与服务器端功能分开。
希望这有帮助。
答案 1 :(得分:3)
您可以做的是覆盖默认的剃刀引擎并创建自己的引擎。剃刀引擎的作用主要是将您的请求映射到特定文件夹中的视图,您可以告诉剃刀引擎何时将这些请求映射到一个或另一个文件夹中的视图。
MVC4 Razor Custom View Locator
这里有一个完整的解释:
http://nickberardi.com/creating-your-first-mvc-viewengine/
对于视图,如果你只想让CSS或JS不同,你只需要将你的请求映射到一个剃须刀捆绑包然后根据一个变量改变捆绑包的内容,或者配置文件,或通过使用数据库中的值填充变量。 正如你在这里看到的那样捆绑很容易:
http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification
假设您的html指向:/assets/mycssbundle.css,但该文件实际包含的内容可以通过您告知捆绑功能文件所在的位置进行更改。
答案 2 :(得分:3)
这似乎是一个设计问题。如果您预计将来可能会发生这样的更改,并且您已经通过DB交换了内容,那么您应该考虑从数据库加载css file 。当然还有许多其他方法可以做到这一点,但简单而有效更可取。
这将意味着正确构建您的html以确保通过CSS正确处理所有布局,并且可以通过ViewData或ViewBag实现。请参阅case example。
修改强> 不是css数据,而是相关的css文件。
答案 3 :(得分:2)
你的问题过于宽泛。
但是我们也有类似的用例。我们将所有与主题相关的东西(css,图像等)作为嵌入式资源放在一个单独的程序集中。我们有Customer1.Theme.dll和Customer2.Theme.dll等。
应用程序动态加载Theme.dll并从那里引用ressrouces。
答案 4 :(得分:2)
您有两种选择:
A)开发一个自定义视图引擎,根据配置在不同页面集之间切换。这将允许您仅通过更改web.config设置在页面集之间切换,这非常适合Visual Studio的内置部署模型(针对不同部署环境的不同web.config转换启动)。可以想到一种实现 - 在不同部署环境的视图引擎之间切换(在不同的web.config转换中)。
与从DB加载页面的其他建议不同,我建议从文件夹或物理位置加载它们(例如,针对项目的不同子文件夹的不同视图引擎)。在开发和修复数据库中的页面及其标记时,数据库方法不适合开发人员。
B)在同一项目下开发所有页面集(所有变体),然后编写自定义部署脚本,根据部署环境部署特定页面集。这种方法的缺点是很难注意到页面集相交或跨越页面集边界的链接等问题。
虽然B计划在开发方面听起来有点简单,但它可能会成为一场噩梦般的维护和部署。
所以,我建议计划A。
答案 5 :(得分:1)
我认为这是一个设计问题。如下所示,您可以在不同的层中组织.net应用程序:
资料来源:Microsoft
Microsoft强烈鼓励通过.net平台提供一些关键原则(Separation of concerns,DRY等),我相信这些原则会在您的项目中得到很好的使用。
根据您描述的内容,一个简单的方法是保留一个项目 - 所有客户端 - 您的业务层(包括服务或数据层 - 即使每个项目使用不同的连接字符串),并为其创建单独的项目表示层。
您可以找到更多信息from Scott,CodeProject或more traditional methods(顺便说一句,这是一本好书)。