我们正在使用ASP.NET MVC构建一个封闭的系统。此演示系统中有多个接触点,但所有接触点都将运行浏览器。所有都将显示基本相同的数据,但目标在几个方面有所不同:
我的问题是:我应该为每个目标类型和页面创建一个单独的控制器,还是控制器应该以某种方式解释哪个目标类型并提供适当的视图?例如,我应该这样做:
TargetType1AccountController
TargetType1HomeController
TargetType2AccountController
TargetType2HomeController
或者这个:
的AccountController / TargetType1View
的AccountController / TargetType2View
HomeController中/ TargetType1View
HomeController / TargetType2View
答案 0 :(得分:5)
我建议您编写自定义视图引擎。这样你的结构可能如下所示:
然后有一个自定义视图引擎:
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)
我会采用你的第二种方法,并且:
答案 2 :(得分:1)
所有人都会显示基本相同的数据,但目标在几个方面有所不同:
- 屏幕尺寸和方向。我们有一些全高清,其他有800x480。有些是肖像,有些是风景,但都是已知的,不会改变。
- 因此,视图将根本不同,并将以这种方式设计。
醇>
使用相同的控制器,因为数据是相同的。如果操作不同/或需要以非常不同的方式检索数据,我只会引入不同的控制器。即使数据有所变化,使用相同的控制器仍可能是一种情况。
如果只有视觉方面,你应该能够用css做到这一点。检查css Zen Garden中的所有替代设计,都共享相同的HTML。
如果您确实需要不同的视图,请确保这些视图特别简单。尽可能多地移动到控制器/视图模型。
使用同一个控制器应用不同视图的方法不止一种: