【问题标题】:Is this the correct pattern to return different views from an ASP.NET MVC controller?这是从 ASP.NET MVC 控制器返回不同视图的正确模式吗?
【发布时间】:2023-04-07 21:28:01
【问题描述】:

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

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

控制器\ 家庭控制器.cs 意见 后台 索引.aspx 上市 索引.aspx 共享 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。

【问题讨论】:

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


    【解决方案1】:

    在您的视图文件夹中,您可以将 BackOffice 和 Public 放在您的 Views/Home 文件夹中

    Views
        Home
          BackOffice
            Index.aspx
          Public
            Index.aspx
    

    你的返回视图应该是这样的

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

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

    【讨论】:

    • return View(@"~/Views/BackOffice/Index.aspx", devices); 确实有效,即使它不是正确的方法。但我认为您的视图文件夹层次结构更有意义。
    • 正如 Kev 所说,您可以在 View() 函数中传递到您的视图的相对路径。
    • 我已经编辑了我的答案,我通常不会将相对路径传递给我的 View() 函数
    【解决方案2】:

    我会说,如果两个视图需要的数据相同,那么使用相同的控制器/路由就可以了。

    但是,如果它们真的完全不同,那么每个视图都可能需要它自己的数据集,在这种情况下,您可能会自掘坟墓。

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

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

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

    【讨论】:

      【解决方案3】:

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

      return View(); //or one of the overloads
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 2012-02-28
        • 1970-01-01
        相关资源
        最近更新 更多