【问题标题】:MVC3 Routing with WebForms使用 WebForms 进行 MVC3 路由
【发布时间】:2011-04-23 00:02:59
【问题描述】:

我有一个使用 WebForms .Net 4.0 的解决方案。我计划在同一个解决方案中使用 MVC3。我关注了 Scott Hanselman blog,事情进展顺利。

我不得不承认我对此很陌生。但是,似乎我错过了路由在命名空间方面的真正工作方式的很大一部分。

目前,我们的解决方案有:

WebApplicatin: 
  Accounting
      Receivables
         ReceivablesGrid.aspx
         ReceivableForm.aspx
      Payables
        PayablesGrid.aspx
        PayablesForm
 ..etc.

因此,您可以使用

请求页面
Domain/Accounting/Receivables/ReceivablesGrid.aspx
Domain/Accounting/Receivables/ReceivableForm.aspx?Key=1
Domain/Accounting/Payables/PayablesGrid.aspx
Domain/Accounting/Payables/PayablesForm.aspx?Key=1

....

我打算添加另一个层来类似于 MVC。

WebApplicatin: 
      Accounting
          Receivables
             ReceivablesGrid.aspx
             ReceivableForm.aspx
             Mobile
              Controllers
                ReceivableConroller.cs
              Models
              Views
                Receivables
                   Index
                   Update
                   Edit
                   Create
          Payables
            PayablesGrid.aspx
            PayablesForm
            Mobile
              Controllers
                PayablesConroller.cs
              Models
              Views
                Payables
                   Index
                   Update
                   Edit
                   Create

     ..etc.

当然,这不是真名。但是,我试图让它尽可能接近我的情况。不幸的是,最好遵循这一点,因为我可以使用一些可能添加到同一名称空间的逻辑。此外,在根目录下创建类似于控制器、视图、模型的文件夹不适用于我的解决方案。

在 Global.asax 中,我添加了这样一条路线:

routes.MapRoute(
      "AccountingReceivablesMobile", // Route name
      "Accounting/Receivables/Mobile/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional });

routes.MapRoute(
      "AccountingPayablesMobile", // Route name
      "Accounting/Payables/Mobile/{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional });

我最终尝试的另一个解决方案是扩展 RazorViewEngine。在新引擎的构造函数中,我设置了两个属性如下:

base.ViewLocationFormats = new string[] { "~/Accounting/Receivables/Mobile/Views/{1}/{0}.cshtml",
"~/Accounting/Payables/Mobile/Views/{1}/{0}.cshtml"
 };

base.MasterLocationFormats = new[] { "~/Views/Shared/{0}.cshtml"}. 

这工作得很好。但是,我只是觉得添加这些路由不像添加 webForm 那样可扩展。我的问题是我真的不想为每条可能的路线添加路线。这意味着,当我添加新视图时,我将有另一个路由或数组条目。 那么,我怎样才能让这更简单?我做错了什么?我查看了 Areas,但它似乎强制创建一个 Areas 文件夹并将其放入其中。

谢谢,

【问题讨论】:

  • 我在回复中假设您在上面概述的结构是一个单独的程序集。意思是“会计”只是网络项目中的一个文件夹,“应付账款”和“应收账款”只是子文件夹。对吗?

标签: asp.net-mvc-3 webforms hybrid


【解决方案1】:

因为 ASP.NET MVC(以及 Rails 和许多其他 MVC 实现)依赖于约定优于配置,所以框架确实希望拥有 \controllers\views 和 @987654324 @ 站点根目录中的目录。你正在做的工作是让路由引擎发现你对约定的偏离,这正是 MVC 试图阻止你做的事情。

您可以扩展框架的一部分,例如使用 Razor 引擎进行测试...但就个人而言,我接受框架的约定,这使得您遇到的一些场景有点棘手,但我知道另一个具有 ASP.NET MVC 简要知识的开发人员可以打开代码并立即找到他们需要关注的领域。将这些 基于约定的 文件夹嵌套在其他文件夹下会使这一点变得不那么明显,除非它们被定义为 MVC 区域。

我有两个生产解决方案,它们是 ASP.NET WebForms 和 MVC3 的混合体。在这两种情况下,我都采用了默认方法(控制器、模型、视图根目录中的文件夹),并开始重构我的遗留 Web 表单代码库以利用存储库模式等现代标准,并将通用业务逻辑移动到“服务”命名空间或解决方案中的新程序集。

通过退后一步重构您的代码以可能使用业务逻辑/存储库类的接口(我假设您目前没有,因为大多数人没有使用 Web 表单),您可以使用 Ninject 或其他IoC 容器使这个逻辑在遗留 Web 表单和 MVC 控制器中的布线更容易(呃),允许更好的结构和单点关注点;通常在你的App_Start()

关于在命名空间之外,如果您针对另一个命名空间编写代码,ReSharper 或 CodeRush 等生产力工具将自动检测并填充您的 using 语句。

我知道这不是您要寻找的答案,有些可能会消失,但我认为退后一步看看您要解决的问题很重要。使 MVC 的基本架构复杂化以适应您的场景将促使我推迟,如果我没有时间/资源来重构一些遗留的商业逻辑或接受内置的约定;从几个简单的控制器开始,以消除 Web 表单应用程序中的痛点,并在时间允许的情况下开始将页面移植到 MVC。过渡期可能不漂亮,但会很简单。

这是一个非常好的问题,您通过扩展 Razor 对您的选项进行了很好的调查。我很想看看其他人是否有偏离标准 MVC 文件夹约定的想法。也许我只是挑剔?

如果您的主要最终目标是让您的网站支持移动设备,那么最后要检查的是 this article,作者是 Steve Sanderson。它利用出色的 51Degrees.mobi 程序集进行移动设备检测,并涵盖在 ASP.NET 和 ASP.NET MVC 中的使用。 Sanderson 在他的个人博客上也有一篇类似的帖子,讨论了相同的主题。

【讨论】:

  • 感谢亚当的回答。我完全理解 MVC 是建立在约定之上的。实际上,这是让我考虑转换的主要观点之一。但是,我们基于 Web 表单的解决方案有数百个按业务领域(会计/库存/生产/等)分组的 Web 来源。我有点惊讶,这以前没有出现过。我想,我要么不得不接受这个半解决方案,要么采用正常的约定。最后,感谢您指点 Sanderson 的文章。很有教育意义。
  • 业务域逻辑是存在于类中还是存在于 *.aspx.cs 文件中?如果他们住在课堂上,我会毫不犹豫地在我的项目中创建一个\services 文件夹,然后为每个业务域创建子文件夹。提取接口,然后你就可以了。这有点遵循奥斯汀 Headspring 的人概述的 MVC 架构,他们为 Manning MVC in Action 书籍做出了贡献。
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多