我有一个团队asp.net-mvc网站,我在site.master页面
我现在需要将该网站用于两个不同的团队,我在两个不同的端口上运行该网站,每个团队只看到他们团队的信息(几乎完全相同的网站和相同的数据库,但只是不同的数据库过滤器)
我通过将其添加到我的控制器类来实现后端:
string team = ConfigurationManager.AppSettings["Team"]
并基于该值,它会更改我运行的数据库查询。这工作得很好,但现在我需要在前端做一些调整(因为我意识到标题图像和一些菜单项也需要改变)
鉴于此,我现在需要重构site.master,因为我需要使用相同的代码库来支持两个不同团队的视图,我想要
(现在只是在site.master文件中硬编码)
我可以将所有代码复制并粘贴到不同的母版页(比如说site2.master)并复制所有常用代码但我想知道是否能够分解所有公共代码2个主文件,以避免重复。
另外,我试图弄清楚如何动态地“弄清楚”基于配置条目使用哪个主文件。我正在考虑使用嵌套的母版页,但这似乎不起作用,因为每个页面确实适用于Team1和Team2,只需要动态设置。我希望避免在每个控制器操作上都有这个开关代码的情况
答案 0 :(得分:1)
由于您将拥有不同的菜单项(这是您所说的确定我的答案的主要部分),我相信两个主视图将是更好的方法,而不是:
a)主视图中的If / Else或
b)您必须在每个条目上解析大量配置条目 请求,
c)为将来的更多自定义主题提供更简单的途径 如此要求或需要。
但是,有一些方法可以减少您需要编写的代码量并避免重复。以下是我建议的一些建议
1.使用与数据库查询设置相同的逻辑,根据团队设置母版页。示例:
<appSettings>
<add key="team" value = "WhateverYouAlreadyHave"/>
<add key="layout" value = "~/Views/Shared/team.master"/>
</appSettings>
2.在您的视图中,在顶部指定布局视图,如下所示:
@{
ViewBag.Title = "My Page Title";
Layout = @ConfigurationManager.AppSettings("layout");
}
3.在主视图中,将JS和CSS纳入可以从母版页调用的共享局部视图
@{Html.RenderPartial("HeadContent");}
我相信这实现了您不会在布局信息中重复自己以及减少主视图中If / Else语句的潜在需求的目标。最后,如果您不得不将网站(不同的服务器或其他东西)分开,您应该能够快速完成,而不会在视图周围浮动代码。
最后,我认为另一种解决方案是保留单个布局文件,但反转共享局部视图中的内容。这意味着您可以将标题图像存储为配置值以及共享的部分视图名称。在这种情况下,将菜单放在他们可以从单个主控制器调用的部分视图中。但是,如果您真的想在将来提供自定义布局/外观/主题,那么使用单个母版页实现这一点会更成问题。