适用于多种不同已知浏览器目标的最佳MVC架构?

时间:2010-09-21 14:34:01

标签: asp.net-mvc-2 architecture

我们正在使用ASP.NET MVC构建一个封闭的系统。此演示系统中有多个接触点,但所有接触点都将运行浏览器。所有都将显示基本相同的数据,但目标在几个方面有所不同:

  1. 屏幕尺寸和方向。我们有一些全高清,其他有800x480。有些是肖像,有些是风景,但都是已知的,不会改变。
  2. 因此,视图将根本不同,并将以这种方式设计。
  3. 我的问题是:我应该为每个目标类型和页面创建一个单独的控制器,还是控制器应该以某种方式解释哪个目标类型并提供适当的视图?例如,我应该这样做:

    TargetType1AccountController
    TargetType1HomeController
    TargetType2AccountController
    TargetType2HomeController

    或者这个:

    的AccountController / TargetType1View
    的AccountController / TargetType2View
    HomeController中/ TargetType1View
    HomeController / TargetType2View

3 个答案:

答案 0 :(得分:5)

我建议您编写自定义视图引擎。这样你的结构可能如下所示:

    • 主页
      • Index.aspx //默认版本
      • UA1
        • Index.aspx //用户代理1的版本
      • UA2
        • Index.aspx //用户代理2的版本
    • 共享

然后有一个自定义视图引擎:

public class CustomViewEngine : WebFormViewEngine
{
    public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
    {
        string ua = controllerContext.HttpContext.Request.UserAgent;
        if (ua == "UA String 1")
        {
            return base.FindView(controllerContext, "UA1/" + viewName, masterName, useCache);
        }
        if (ua == "UA String 2")
        {
            return base.FindView(controllerContext, "UA2/" + viewName, masterName, useCache);
        }

        return base.FindView(controllerContext, viewName, masterName, useCache);
    }
}

最后在Application_Start注册视图引擎:

ViewEngines.Engines.Clear();  
ViewEngines.Engines.Add(new CustomViewEngine());

这样,您的控制器和操作完全相同,并且基于User-Agent HTTP标头将使用正确的视图。当您必须处理UA3时,您需要做的就是在UA3文件夹中添加相应的视图。无需触摸控制器和型号。

答案 1 :(得分:2)

我会采用你的第二种方法,并且:

  • 尝试使用CSS尽可能多地使用CSS,然后才能使用备用视图
  • 如果需要备用视图,它们应该共享同一个控制器,因为大多数逻辑应该相同或非常相似
  • 使用partials分享视图之间常见的HTML代码段

答案 2 :(得分:1)

  

所有人都会显示基本相同的数据,但目标在几个方面有所不同:

     
      
  1. 屏幕尺寸和方向。我们有一些全高清,其他有800x480。有些是肖像,有些是风景,但都是已知的,不会改变。
  2.   
  3. 因此,视图将根本不同,并将以这种方式设计。
  4.   

使用相同的控制器,因为数据是相同的。如果操作不同/或需要以非常不同的方式检索数据,我只会引入不同的控制器。即使数据有所变化,使用相同的控制器仍可能是一种情况。

如果只有视觉方面,你应该能够用css做到这一点。检查css Zen Garden中的所有替代设计,都共享相同的HTML。

如果您确实需要不同的视图,请确保这些视图特别简单。尽可能多地移动到控制器/视图模型。

使用同一个控制器应用不同视图的方法不止一种:

  • @Darin提到的自定义引擎。如果未定义特定视图,请确保它使用默认视图,这样您就可以仅在真正需要时定义特定视图。
  • 用于切换要使用的视图的操作过滤器
  • 自定义视图结果,用于实例化指向相应视图的新视图结果。与此asp-net-mvc-hybridviewresult-viewresult-partialviewresult类似(那个是forresresult与viewresult,但概念是相同的。)