繁体   English   中英

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

[英]Using MVC3 with folder structure like regular ASP.NET

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

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

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

  1. 它遵循目录结构来查找没有显式路由映射的控制器
  2. 视图与相应的控制器位于同一文件夹中
  3. 路由魔术仍然适用于动作和参数

例如,我想要一个请求/fus/ro/dah/尝试在\\webroot\\fus\\ro\\dah\\文件夹中找到DahController并执行其Index操作。 如果没有找到它会在\\webroot\\fus\\ro\\文件夹等中寻找带有Dah动作的RoController

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

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

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

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

混合Asp.net和Razor

例如,我想要一个请求/ fus / ro / dah /尝试在\\ webroot \\ fus \\ ro \\ dah \\文件夹中找到DahController并执行其Index操作。 如果没有找到它会在\\ 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

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

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

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

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

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

VSC的MVC脚手架与物理目录

  • 我可以通过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导航到它

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

心连心....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM