【问题标题】:ASP.NET MVC controller actions designASP.NET MVC 控制器动作设计
【发布时间】:2010-10-10 08:13:08
【问题描述】:

我真的很喜欢 ASP.NET MVC 的工作方式。我很想在所有新的 Web 项目中实现它,但是前几天我在原型中遇到了一个问题,我真的没有找到一个好的解决方案,所以我问你,你将如何设计 MVC 应用程序这不符合典型的 REST 模式?例如,我正在设计的原型会有多个页面,但这些页面本身不一定绑定到域模型。以一个简单的注册站点为例,它可能有以下页面:

  • /Default.aspx
  • /Register.aspx
  • /ThankYou.aspx

有时,此类程序可能需要管理部分来处理诸如审核注册或查看数据之类的详细信息。在标准的 ASP.NET Web 应用程序中,我可能会添加以下内容

  • /Admin/Default.aspx
  • /Admin/ListRegistrations.aspx
  • /Admin/ViewReports.aspx ...

在这种情况下,有两个控制器,例如:

  • 首页->首页
  • 首页->注册
  • 首页->谢谢你
  • 管理->索引
  • Admin->ListRegistrations
  • 管理员->报告

我对此感到沮丧的是,子控制器和区域还没有真正可靠的实现。我知道 Phil Haack 制作的“Areas”原型,但它不是很成熟,坦率地说,我不确定我是否喜欢它的设置方式,但我真的不知道我喜欢什么也可以看到这项工作。

我想当我想到 MVC 时,我也倾向于想到 REST,并且让控制器动作代表页面而不是实际实体或动作并不适合我。你怎么看?

【问题讨论】:

    标签: asp.net-mvc model-view-controller rest


    【解决方案1】:

    我通常放弃“主页”控制器作为项目中的第一件事,并将其替换为“页面”控制器。我将那个用于“只是”一页的任何内容。诸如“常见问题解答”、“联系我们”等之类的内容。我这样做至少部分是因为 Home 控制器的默认方法需要在您每次需要一个基本的静态页面时添加一个新方法。

    在那个控制器中,我只有一个动作:显示。该操作为所有这些页面提供了相同的上下文对象。我实际上使用查找“slug”将这些页面的内容存储在数据库中,并将其绑定到 NVelocity 模板中,但即使只是静态 HTML 或文件中的 NVelocity 模板也可以。

    其他任何东西,就像其他人所说的那样,被管理的“东西”分成控制器。所以,一个 ReportController、User 或 AccountController、CartController 等。然后这些操作就更有意义了。

    当您谈论列出注册用户时,它实际上是一个用户列表,所以我有一个 UserController 并执行 /User/Display/Registered/MostRecent 或类似的操作。对于注册本身,/User/Register 将发布到 /User/SaveRegistration,而 /User/SaveRegistration 又可以从那里重定向到 /User/DisplayProfile/NewUserID 或 /Page/Display/Home。

    【讨论】:

      【解决方案2】:

      您始终可以将 ASP.NET Web 窗体与 MVC 混合使用。

      只需添加

      routes.IgnoreRoute("Pages/{*path}");
      

      到您的路由表并将传统 Web 表单页面添加到应用程序的 Pages 文件夹。

      【讨论】:

      • 这可能是最好的主意。我可以看到将网站的用户部分设计为使用 MVC 内容,同时将管理员特定的逻辑保留在常规 Web 表单中。谢谢你提醒我。
      【解决方案3】:

      MVC 新手犯的一个错误是出于显示原因将操作分组到控制器中。在您的情况下,不要将 Register 和ThankYou 操作与主页分组,而是尝试将它们分离到 AccountController 中,就像 MVC 团队在示例项目中所做的那样。您可以使用路由来设置最终用户想要的 URL。

      至于您的其他操作,ReportController 怎么样?然后,您可以另外拥有一个 AdministrationController,其索引操作/视图包含指向各种管理操作的链接,包括 ReportController 上的那些。

      短版:按功能将操作分组到控制器中,而不是按站点导航。

      【讨论】:

      • 我明白了,但视图呢?在我描述的场景中,我可能希望管理部分的控制器操作继承一个单独的母版页,而不是用户部分的那些。根据他们使用的母版页以这种方式隔离视图似乎没有一个好的逻辑方法。
      • 控制器操作 = 视图,我的意思是
      • 您可以在 Views/Admin 文件夹中拥有一个 Admin masterpage,供 Views/Report 中的视图参考。我看不出这样做有什么问题 - 你真的在这里谈论演示模板,控制器不应该知道任何事情。
      【解决方案4】:

      您可以拥有尽可能多的控制器;这种布局看起来很合理。请注意,路由没有 直接映射到 {controller}/{action},但它使事情变得简单。对我来说看起来不错 - 除了我可能会将ThankYou 作为视图 - 即注册 [GET] 可能使用不同的视图来注册 [POST]

      【讨论】:

      • 当谈到一个可能有嵌套文件夹来隔离功能的典型场景时,我想我对这种模式的困惑/沮丧真的开始形成了。例如,用于用户的产品控制器,然后是用于维护产品的 Admin->Products 控制器。在哪里?怎么样?
      猜你喜欢
      • 1970-01-01
      • 2016-08-23
      • 1970-01-01
      • 2019-01-02
      • 2017-01-08
      • 2011-07-13
      • 2013-10-26
      • 1970-01-01
      • 2010-11-25
      相关资源
      最近更新 更多