ASP.NET MVC控制器动作设计

9
我非常喜欢ASP.NET MVC的工作方式。我希望在所有新的Web项目中实现它,但是在我设计的原型中遇到了一些问题,这个问题我还没有找到一个好的解决方案。所以我想问你,如果要设计一个不符合典型REST模式的MVC应用程序,你会如何设计?例如,我正在设计的原型将有几个页面,但这些页面本身并不一定绑定到域模型上。例如,一个简单的注册站点可能会有以下页面:
- /Default.aspx - /Register.aspx - /ThankYou.aspx
偶尔,这样的程序可能需要一个管理部分来处理诸如审核注册或查看数据等细节。在标准的ASP.NET Web应用程序中,我可能会添加以下内容:
- /Admin/Default.aspx - /Admin/ListRegistrations.aspx - /Admin/ViewReports.aspx
在这种情况下,是否将两个控制器设计成以下方式会违反MVC模式:
- Home->Index - Home->Register - Home->ThankYou - Admin->Index - Admin->ListRegistrations - Admin->Reports
我的困扰加剧了由于还没有真正的子控制器和区域的实现。我知道Phil Haack组织的“Areas”原型,但它并不是很成熟,而且说实话,我不确定我喜欢它的设置方式,但我也不知道我希望看到它如何工作。
我想,当我想到MVC时,我也会想到REST,并且具有表示页面而不是实际实体或操作的控制器操作并不适合我。你怎么看?
4个回答

3
你可以随时将ASP.NET Web Forms与MVC混合使用。
只需添加:
routes.IgnoreRoute("Pages/{*path}");

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

这可能是最好的想法。我可以看到设计网站用户部分使用MVC,同时保持管理员特定逻辑在常规Web表单中。谢谢你提醒我。 - Chris

3
新手在MVC中犯的一个错误是出于显示原因将操作分组到控制器中。在您的情况下,不要将注册和感谢页面与主页分组,而是像MVC团队在示例项目中所做的那样,将它们分开放在一个名为AccountController的控制器中。您可以使用路由来设置最终用户希望的Url。
至于其他操作,如何创建一个ReportController?然后,您还可以创建一个AdministrationController,其Index操作/视图包含链接到各种管理操作,包括ReportController上的操作。
简而言之,请按功能将操作分组到控制器中,而不是网站导航。

我了解这点,但是关于视图呢?在我描述的场景中,我可能希望管理员部分的控制器操作继承一个不同的母版页,而不同于用户部分的操作。基于它们使用的母版页来隔离视图似乎没有一个好的逻辑方式。 - Chris
控制器动作 = 视图,我的意思是 - Chris
你可以在 Views/Admin 文件夹中拥有一个 Admin 主页面,Views/Report 中的视图引用它。我认为这样做没有任何问题 - 你实际上是在谈论演示模板,而不是控制器应该知道的内容。 - Troy

3
我通常会在项目中将“Home”控制器取消,并用“Page”控制器替换它。我将它用于任何“仅仅是页面”的东西,例如“FAQ”,“联系我们”等等。我这样做至少部分原因是默认的Home控制器方法需要每次添加一个新方法,即使只是一个基本的静态页面也是如此。
在那个控制器中,我只有一个动作:Display。该操作为所有这些页面提供相同的上下文对象。实际上,我使用数据库存储这些页面的内容,并使用查找“slug”连接NVelocity模板,但即使使用静态HTML或文件中的NVelocity模板也可以。
其他任何东西,就像其他人所说的一样,都会根据正在管理的“东西”被拆分成控制器。因此,ReportController,User或AccountController,CartController等等。然后,操作变得更加合理。
当你谈论列出注册用户时,它实际上是一个用户列表,因此我会有一个UserController并进行/User/Display/Registered/MostRecent或类似的操作。对于注册本身,/User/Register,它将发布到/User/SaveRegistration,然后可以重定向到/User/DisplayProfile/NewUserID或/Page/Display/Home。

1

你可以拥有尽可能多的控制器,那个布局看起来很合理。请注意,路由不一定要直接映射到 {controller}/{action},但这样做会使事情变得简单。在我看来,这看起来很好 - 除了我可能会将 ThankYou 视为一个视图 - 也就是说,Register [GET] 可能使用与 Register [POST] 不同的视图。


1
当谈到典型情况,即可能有嵌套文件夹来隔离功能时,我对这种模式的困惑和挫败感开始逐渐加剧。例如,为用户创建产品控制器,但是为维护产品创建Admin->Products控制器。在哪里?如何实现? - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接