0

我有一个团队 asp.net-mvc 网站,并且在我的 site.master 页面中

  • 标题图片
  • 一份菜单
  • 我所有的 js 和 css 包括。

我现在需要将该站点用于两个不同的团队,我在两个不同的端口上运行该站点,每个团队只看到他们团队的信息(几乎相同的确切站点和相同的数据库,但只是不同的数据库过滤器)

我通过将它添加到我的控制器类来实现后端:

     string team = ConfigurationManager.AppSettings["Team"]

并基于该值,它会更改我运行的数据库查询。效果很好,但现在我需要对前端进行一些调整(因为我意识到标题图像和一些菜单项也需要更改)

鉴于此,我现在需要重构 site.master,因为我需要使用相同的代码库来支持两个不同团队的视图,并且我想要

  • 每个团队展示自己的headerImage
  • 每个团队都有自己的菜单项
  • 避免重复任何通用代码(如 css 和 js 包含)

(现在只是硬编码在 site.master 文件中)

我可以将所有代码复制并粘贴到不同的母版页(比如说 site2.master)并复制所有公共代码,但我想看看是否有能力在 2 个 master 之间分解出所有公共代码文件以避免重复。

另外,我试图弄清楚如何让我的代码根据配置条目动态地“找出”要使用的主文件。我正在考虑使用嵌套母版页,但这似乎不起作用,因为每个页面确实适用于 Team1 和 Team2,并且只需要动态设置。我希望避免在每个控制器操作上都有此开关代码的情况

4

1 回答 1

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 语句的潜在需求。最后,如果您不得不分离站点(不同的服务器或其他东西),您应该能够快速地做到这一点,而不会在您的视图中出现死代码。

最后,我认为另一种解决方案是保留单个布局文件,但反转进入共享局部视图的内容。这意味着您可以将标题图像存储为配置值以及共享的部分视图名称。在这种情况下,将您的菜单放在它们自己的局部视图中,您可以从单个主控器调用它。但是,如果您将来真的想提供自定义布局/外观/主题,那么使用单个母版页实现这一点会更有问题。

于 2013-03-19T13:45:20.947 回答