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

Ada*_*sey 1 architecture asp.net-mvc-2

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

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

我的问题是:我应该为每个目标类型和页面创建一个单独的控制器,还是控制器应该以某种方式解释哪个目标类型并提供适当的视图?例如,我应该这样做:

TargetType1AccountController
TargetType1HomeController
TargetType2AccountController
TargetType2HomeController

或这个:

AccountController/TargetType1View
AccountController/TargetType2View
HomeController/TargetType1View
HomeController/TargetType2View

Dar*_*rov 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后注册视图引擎Application_Start:

ViewEngines.Engines.Clear();  
ViewEngines.Engines.Add(new CustomViewEngine());
Run Code Online (Sandbox Code Playgroud)

这样,您的控制器和操作完全相同,并且基于User-AgentHTTP标头将使用正确的视图.您需要处理的所有操作UA3都是在UA3文件夹中添加相应的视图.无需触摸控制器和型号.