0

So I am reading about building MVC3 projects and there is one thing that seriously bugs me. The folder structure of the project in no way corresponds to the path of the HTTP request. There is a bunch of things I like and would want to use, but having a flat folder structure is not one of them.

Why is this a problem? Well, I see it becoming a problem when building a site with a heavy mix of content pages and various forms/dynamic pages (most of our sites are like that), which would typically be done by different people. It seem it would be too complicated for client-side developers to follow routing rules of dynamic pages and/or creating new ones.

What I would like to understand is if there is way to configure MVC3 application in such a way that:

  1. it follows directory structure for finding controllers without explicit route map for each one
  2. views live in the same folder as corresponding controller
  3. routing magic still works for actions and parameters

For instance I'd like to have a request /fus/ro/dah/ to try to find DahController in the \webroot\fus\ro\dah\ folder and execute its Index action. If not found it would look for RoController with Dah action in the \webroot\fus\ro\ folder, etc.

It is entirely possible that MVC was not meant to be working this way at all and I am just trying to force a square peg into a round hole.

UPDATE: Looks like I can drop a view file into the desired folder structure, and it will be executed. However layout would not work apparently because it is expecting a controller. Does this mean I have to create a controller for pure content pages? That is a pretty crappy design...

UPDATE 2: Main issue right now is that creating "fus" folder means that MVC will not even attempt to look for FusController... not under "fus" folder, nor anywhere else. Is it possible to get around that?

4

5 回答 5

1

例如,我想要一个请求 /fus/ro/dah/ 尝试在 \webroot\fus\ro\dah\ 文件夹中找到 DahController 并执行其索引操作。如果未找到,它将在 \webroot\fus\ro\ 文件夹等中查找具有 Dah 操作的 RoController。

MVC 不是为这样的特定需求而设计的,它是使用模型-视图-控制器模式构建应用程序的通用框架。

如果你不能为框架弯曲应用程序,你可以为应用程序弯曲框架,老实说,MVC 是非常可定制的。[作为证明,在我正在工作的当前项目(从 ASP 到 MVC 的迁移)中,我们有 xml 格式的模型并且没有类,我们也使用 XSLT 进行渲染。通过一些工作,我们创建了自定义组件,如自定义视图引擎、自定义验证提供程序、自定义模型绑定器......以使框架最适合应用程序,并且确实如此]

MVC 不是设计的,也不是强制使用它,您可以根据需要自定义/扩展。在您的情况下,您可能需要创建一个

自定义控制器工厂(因为您要自定义选择控制器的方式),

自定义视图引擎(因为您想自定义放置视图的位置)

并且可能是其他人。

对于自定义控制器工厂,您必须扩展DefaultControllerFactory类。您可以通过 Google 找到很多关于如何创建自定义控制器工厂的文章。

根据您使用的视图引擎,您必须扩展相应的视图引擎。例如。如果您使用的是 web 表单,那么您必须扩展WebFormsViewEngine它,然后剃须刀RazorViewEngine

了解更多信息。检查这个链接

http://codeclimber.net.nz/archive/2009/04/08/13-asp.net-mvc-extensibility-points-you-have-to-know.aspx

于 2012-06-03T03:51:47.677 回答
1

你可以混合 Asp.net 和 Asp.net MVC。正如 LukLed 所说,MVC 是约定优于配置模式。如果你遵守约定。你不需要配置。您可以查看此链接以将 asp.net 内容与 MVC3 混合

混合 Asp.net 和 Razor

于 2012-06-03T01:40:34.340 回答
0

也考虑使用区域。我认为这帮助我诚实地克服了 MVC 的文件夹结构问题。所以我可以使用基本文件夹作为我的主页详细信息,然后我可以有一个“管理”区域,它是一个单独的文件夹,诸如此类。

于 2012-06-03T01:54:10.223 回答
0

我相信 ASP.NET MVC 不应该以这种方式使用。虽然您可以配置 MVC 来执行此操作,但最好保持标准/controller/action/parametersURL 格式。如果您有具有许多不同功能的复杂网站,那么这些区域可能会有所帮助http://msdn.microsoft.com/en-us/library/ee671793.aspx。每个区域都有自己的一组控制器、模型和视图,因此在网站不同部分工作的团队不会互相干扰。

虽然听起来很方便,但该框架首先搜索 DahController 并执行 Index 操作,然后再搜索另一个,我觉得这不是一个好主意。URL 应该明确定义,并且带有 Ro 动作的 Fus 控制器不应该只是停止工作,因为有人创建了带有 Index 动作的 RoController。

于 2012-06-03T01:35:01.487 回答
0

您希望它有多“常规 ASP.net”?如果您想将“传统”ASP.Net Web 表单与 MVC 混合,您当然可以 - re:将 MVC 与“基于文件的 aspx”混合 - 也称为“混合”。归根结底,都是 ASP.Net。

这是由 Visual Studio 生成的标准 MVC 应用程序。我添加了一个文件夹somedirectory,我想在其中使用旧folder/file.ext范式并拥有一个default.aspxWeb 表单文件:

VS 用物理目录搭建 MVC 脚手架

  • 我可以通过导航到它http://foo.com/somedirectory吗?的。
  • 我也可以使用“漂亮的网址”吗?是的

VS生成的香草Global.asax,刚刚添加MapPageRoute

....

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    //using "pretty urls" - ordering your routes matter.
    routes.MapPageRoute("theWebForm", "legacy", "~/somedirectory/default.aspx");

    routes.MapRoute(
        "Default", 
        "{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
}
  • 所以现在我可以通过http://foo.com/legacy

只需检查您的路线顺序,并可能计划您的命名约定,这样您就不会遇到“冲突”......

嗯……

于 2012-06-03T04:52:03.200 回答