这是从ASP.NET MVC控制器返回不同视图的正确模式吗?

时间:2010-07-09 00:15:50

标签: asp.net asp.net-mvc asp.net-mvc-2

我的应用程序具有公共“最终用户”模式和“后台”模式。两种“模式”几乎共享相同的控制器逻辑,但这些不同“模式”的用户界面完全不同。

使用首次创建项目时获得的开箱即用默认路由我有以下内容:

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.

3 个答案:

答案 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