2010-07-09 92 views
4

我有一个具有公共“最终用户”模式和“后台办公”模式的应用程序。两种“模式”几乎都共享相同的控制器逻辑,但这些不同“模式”的用户界面完全不同。这是从ASP.NET MVC控制器返回不同视图的正确模式吗?

使用了现成的默认路由是你当首次创建一个项目,我有类似如下:

 
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
在您查看文件夹

您可以将您的BackOffice和公众对你的意见/ Home文件夹

Views 
    Home 
     BackOffice 
     Index.aspx 
     Public 
     Index.aspx 

以及返回查看应该是这样的

return View("BackOffice/Index", devices); 

return View("Public/Index", devices); 

控制器总是首先寻找控制器视图名称文件夹中的视图。如果您的控制器是HomeController,它将始终在Views/Home文件夹中查找View。

+0

做'返回查看(@“〜/查看/内部/的Index.aspx”,设备);'不实际工作,即使它不是正确的方式来做到这一点。但我认为你的视图文件夹层次结构更有意义。 – Kev 2010-07-09 00:59:55

+0

正如Kev所说,你可以在'View()'函数中传递一个相对路径到你的视图。 – Omar 2010-07-09 03:59:56

+0

我已经编辑了我的答案,我通常不会将相对路径传递给View()函数 – 2010-07-09 04:40:32

1

我要说的是,如果这两种观点所需要的数据是一样的,那么这将是确定使用相同的控制器/路由。但是,如果他们真的是完全不同的,那么每个视图都可能需要它自己的一组数据,在这种情况下,您可能正在挖掘自己的洞。

你可能会考虑返回另一个函数的结果而不是视图;像这样:

return IsBackOffice()? getBackOfficeView() : getPublicView() ; 

这样你就没有一堆if/else在同一个控制器动作。

0

我会写一个视图引擎来抽象出来。这样,所有的控制器仍然需要做的就是:

return View(); //or one of the overloads 
相关问题