我非常喜欢ASP.NET MVC的工作方式。我希望在所有新的Web项目上实现它,但是前几天我在原型中遇到了一个问题,我真的没有找到一个好的解决方案,所以我问你,你将如何设计一个MVC应用程序那不符合典型的REST模式?作为一个例子,我设计的原型将有几个页面,但页面本身不一定绑定到域模型。例如,选择一个简单的注册站点,该站点可能包含以下页面:
有时,此类程序可能需要管理部分来处理监控注册或查看数据等详细信息。在标准的ASP.NET Web应用程序中,我可能会添加以下内容
在这种情况下,它是否会与MVC模式产生不可接受的偏差,因为它有两个控制器,如:
由于没有真正可靠的子控制器和区域实现这一事实,我对此感到沮丧。我知道Phil Haack组装的“区域”原型,但它不是很成熟,而且坦率地说,我不确定我喜欢它的设置方式,但我真的不知道我喜欢怎么样看到那项工作。
我想当我认为MVC时,我倾向于认为REST,并且拥有代表页面而非实际实体或动作的控制器动作并不适合我。你觉得怎么样?
答案 0 :(得分:3)
MVC的新成员犯的一个错误是出于显示原因将操作分组到控制器中。在您的情况下,不要将Register和ThankYou操作分组到主页中,而是将其分离到AccountController中,就像MVC团队在示例项目中完成的那样。您可以使用路由来为最终用户设置Url。
至于你的其他行动,ReportController怎么样?然后,您还可以拥有一个AdministrationController,其Index操作/视图包含指向各种管理操作的链接,包括ReportController上的操作。
短版本:按功能将操作分组到控制器,而不是网站导航。
答案 1 :(得分:3)
我通常抛弃“Home”控制器作为项目中的第一件事,并用“Page”控制器替换它。我用那个“只是”一页的东西。像“FAQ”,“联系我们”等等。我至少部分地这样做,因为Home控制器的默认方法需要在每次需要基本的静态页面时添加新方法。
在那个控制器中,我只有一个动作:显示。该操作为所有这些页面提供了相同的上下文对象。我实际上使用查找“slug”将这些页面的内容存储在数据库中并将其绑定到NVelocity模板中,但即使文件中的静态HTML或NVelocity模板也可以工作。
其他任何东西,就像其他人说的那样,被管理的“东西”分裂成控制器。所以,一个ReportController,User或AccountController,CartController等等。然后这些动作更有意义。
当你在谈论列出注册用户时,它实际上是一个用户列表,所以我有一个UserController并执行/ User / Display / Registered / MostRecent或类似的东西。对于注册本身,/ User / Register将发布到/ User / SaveRegistration,然后可以从那里重定向到/ User / DisplayProfile / NewUserID或/ Page / Display / Home。
答案 2 :(得分:3)
您始终可以将ASP.NET Web窗体与MVC混合使用。
添加
routes.IgnoreRoute("Pages/{*path}");
到您的路由表,并将传统的Web表单页面添加到应用程序的Pages
文件夹中。
答案 3 :(得分:1)
你可以拥有尽可能多的控制器;这种布局看起来很合理请注意,路径不 直接映射到{controller} / {action},但它保持简单。看起来很好 - 除了我可能有一个ThankYou作为一个视图 - 即Register [GET]可能使用不同的视图来注册[POST]