在asp.net-mvc中,如何重构我的site.master页面以支持2个不同的主视图?

时间:2013-03-19 11:49:09

标签: sql-server asp.net-mvc master-pages appsettings

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

  • 标题图片
  • 菜单
  • 我所有的js和css都包括在内。

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

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

     string team = ConfigurationManager.AppSettings["Team"]

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

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

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

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

我可以将所有代码复制并粘贴到不同的母版页(比如说site2.master)并复制所有常用代码但我想知道是否能够分解所有公共代码2个主文件,以避免重复。

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

1 个答案:

答案 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语句的潜在需求的目标。最后,如果您不得不将网站(不同的服务器或其他东西)分开,您应该能够快速完成,而不会在视图周围浮动代码。

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