使用WebForms的MVC3路由

| 我有一个使用WebForms .Net 4.0的解决方案。我打算在同一解决方案中使用MVC3。我关注了Scott Hanselman的博客,事情进展缓慢。 我必须承认我对此很陌生。但是,似乎路由对于命名空间的真正工作方式缺少很大一部分。 当前,我们的解决方案具有以下优势:
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.
当然,这不是真实姓名。但是,我试图使其尽可能接近我的情况。不幸的是,如果遵循这一点,那将是最好的,因为我可以使用可能添加到同一名称空间的某些逻辑。而且,在根目录下创建类似于Controllers,Views,Models的文件夹不适用于我的解决方案。 在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(以及Rails和许多其他MVC实现)依赖于配置约定,所以该框架确实希望站点根目录中具有ѭ5have,
\\views
\\models
目录。您正在做的使路由引擎承担起偏离惯例的工作正是MVC试图阻止您执行的工作。 您可以扩展框架的一部分,例如使用Razor引擎进行测试...但是,就我个人而言,我接受框架的约定,这使某些情况(例如您遇到的问题)有些棘手,但我知道另一位具有对ASP.NET MVC的简要了解可以打开代码,并立即找到他们需要关注的领域。将那些基于约定的文件夹嵌套在其他文件夹下将使这种情况不那么明显,除非将它们定义为MVC区域。 我有两种生产解决方案,它们是ASP.NET WebForms和MVC3的混合体。在这两种情况下,我都采用默认方法(控制器,模型,查看根目录中的文件夹),并开始重构我的旧版Web表单代码库,以利用诸如存储库模式之类的现代标准,并将通用业务逻辑移至“服务”中。 \“名称空间或解决方案中的新程序集。 通过退后重构代码以可能将接口用于业务逻辑/存储库类(我假设您当前不使用接口,因为大多数人不使用Web表单),您可以使用Ninject或其他IoC容器,使在旧版Web表单和MVC控制器中都可以更轻松地连接此逻辑,从而提供更好的结构和关注点;通常在您的
App_Start()
中。 关于在名称空间之外,如果您针对另一个名称空间编写代码,那么诸如ReSharper或CodeRush之类的生产力工具将自动检测并填充您的
using
语句。 我知道这不是您要找的答案,有些可能会消失,但我认为退后一步,看看您要解决的问题很重要。使MVC的基本体系结构复杂化以适合您的情况将促使我在没有足够的时间/资源重构某些传统biz逻辑的情况下推迟执行,或者接受既定的惯例;从几个简单的控制器开始,以消除Web窗体应用程序中的痛点,并在时间允许的情况下开始将页面移植到MVC。过渡期可能并不漂亮,但是会很简单。 这是一个非常好的问题,您通过扩展Razor在研究选项方面做得很好。我很想看看是否还有其他人有偏离标准MVC文件夹约定的想法。也许我只是挑剔? 如果您的主要目标是使您的网站启用移动功能,那么最后要检查的是Steve Sanderson的这篇文章。它利用出色的51Degrees.mobi程序集进行移动设备检测,并涵盖了ASP.NET和ASP.NET MVC内的使用。桑德森在他的个人博客上也有类似的帖子,涉及相同的主题。     

要回复问题请先登录注册