使用MVC3与常规ASP.NET的文件夹结构

时间:2012-06-02 23:26:19

标签: c# asp.net asp.net-mvc

所以我正在阅读有关构建MVC3项目的内容,并且有一件事情让我很烦恼。项目的文件夹结构决不会对应HTTP请求的路径。有很多我喜欢和想要使用的东西,但是有一个扁平的文件夹结构不是其中之一。

为什么这是一个问题?好吧,我认为在构建一个内容页面和各种表单/动态页面(我们大多数网站都是这样)的网站时会出现问题,这通常是由不同的人完成的。对于客户端开发人员来说,遵循动态页面的路由规则和/或创建新的规则似乎太复杂了。

我想了解的是,是否有办法以这样的方式配置MVC3应用程序:

  1. 它遵循目录结构,用于查找没有显式路由映射的控制器
  2. views与相应的控制器位于同一文件夹中
  3. 路由魔法仍适用于操作和参数
  4. 例如,我希望请求/fus/ro/dah/尝试在DahController文件夹中找到\webroot\fus\ro\dah\并执行其Index操作。如果找不到,则会在RoController文件夹中查找Dah \webroot\fus\ro\次操作。

    完全有可能MVC根本就不是这样工作的,我只是想把一个方形的钉子压成一个圆孔。

    更新 看起来我可以将视图文件放入所需的文件夹结构中,然后执行它。然而,布局显然不会起作用,因为它期待一个控制器。这是否意味着我必须为纯内容页面创建一个控制器?这是一个非常糟糕的设计......

    更新2: 现在的主要问题是创建“fus”文件夹意味着MVC甚至不会尝试查找FusController ...不在“fus”文件夹下,也不在其他任何地方。有可能解决这个问题吗?

5 个答案:

答案 0 :(得分:1)

你可以混合使用Asp.net和Asp.net MVC。正如LukLed所说,MVC是配置模式的惯例。如果你遵循惯例。你不需要配置。你可以查看这个链接,将asp.net内容与MVC3混合

Mixing Asp.net and Razor

答案 1 :(得分:1)

  

例如,我想要一个请求/ fus / ro / dah /试图找到   位于\ webroot \ fus \ ro \ dah \文件夹中的DahController并执行其索引   行动。如果没有找到它将寻找具有Dah动作的RoController   \ webroot \ fus \ ro \文件夹等

MVC不是针对这样的特定需求而设计的,它是使用 model-view-controller 模式构建应用程序的通用框架。

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

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

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

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

可能是其他人。

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

根据您使用的视图引擎,您必须扩展相应的视图引擎。对于前者如果您使用的是网络表单,那么您必须扩展WebFormsViewEngine并将其扩展为RazorViewEngine

了解更多信息。查看此链接

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如何“常规ASP.net”你想要它?如果你想用MVC混合使用“遗留”的ASP.Net Web Forms,你当然可以 - 将MVC与“基于文件的aspx”混合 - 也称为“混合”。在一天结束时,它都是ASP.Net。

这是Visual Studio生成的标准MVC应用程序。我添加了一个文件夹somedirectory,我希望在其中使用旧版folder/file.ext范例并拥有default.aspx Web窗体文件:

MVC scaffolding by VS with physical directory

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

VS生成的Vanilla 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
  • 导航到它

只需检查路线的顺序,并计划您的命名惯例,这样就不会发生“碰撞”......

H个....