我的应用程序具有公共“最终用户”模式和“后台”模式。两种“模式”几乎共享相同的控制器逻辑,但这些不同“模式”的用户界面完全不同。
使用首次创建项目时获得的开箱即用默认路由我有以下内容:
Controllers\ HomeController.cs Views BackOffice Index.aspx Public Index.aspx Shared BackOfficeSite.Master PublicSite.Master
在我的HomeController.cs
我的逻辑看起来像这样:
public ActionResult Index()
{
var devices = DeviceRepository.FindDevicesByCustomer(100);
if(IsBackOffice())
{
return View(@"~/Views/BackOffice/Index.aspx", devices);
}
return View(@"~/Views/Public/Index.aspx", devices);
}
这是正确的做法吗?还是我自己挖了一个反模式洞?
我正在使用ASP.NET MVC 2.
答案 0 :(得分:3)
在您的视图文件夹中,您可以将BackOffice和Public放在Views / Home文件夹中
Views
Home
BackOffice
Index.aspx
Public
Index.aspx
并且您的返回视图应该如下所示
return View("BackOffice/Index", devices);
return View("Public/Index", devices);
控制器将始终首先在控制器的View Name文件夹中查找View。如果您的Controller是HomeController,它将始终在Views / Home文件夹中查找View。
答案 1 :(得分:1)
我想说如果两个视图所需的数据相同,那么可以使用相同的控制器/路径。
然而,如果它们真的完全不同,那么每个视图可能都需要它自己的数据集,在这种情况下,你可能会把自己挖到一个洞里。
您可以考虑返回另一个函数的结果而不是视图;像这样的东西:
return IsBackOffice()? getBackOfficeView() : getPublicView() ;
这样你在同一个控制器动作中就没有一堆if / else。
答案 2 :(得分:0)
我会编写一个视图引擎来抽象出来。这样你的所有控制器仍然需要做的是:
return View(); //or one of the overloads