2011-04-23 56 views
5

我有一个使用WebForms .Net 4.0的解决方案。我打算在相同的解决方案中使用MVC3。我跟着斯科特汉塞尔曼blog,事情正在上升。我不得不承认我对此很新颖。然而,似乎我错过了路径在名称空间方面真正起作用的重要部分。使用WebForms进行MVC3路由

目前,我们的解决方案有以下几种:

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那样可伸缩。我的问题是我真的不想为每条可能的路线添加路线。这意味着,当我添加一个新视图时,我会有另一条路由或数组入口。 那么,我怎样才能让这个更简单?我在做什么错?我看着区域,但它似乎强制创建一个地区文件夹,并把它放在里面。

感谢,

+0

我在回复中做出了这样的假设:您在上面列出的结构是单个程序集。含义“会计”只是Web项目中的一个文件夹,“应付账款”和“应收账款”仅仅是子文件夹。那是对的吗? – adammokan 2011-05-02 19:16:19

回答

4

因为ASP.NET MVC(以及Rails和许多其他MVC实现)依靠约定优于配置,框架真的希望有\controllers\views和在目录网站的根。您正在做的工作,以便让路由引擎吸收您偏离惯例,这是MVC试图阻止您做的事。

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

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

通过重新构建您的代码来可能使用业务逻辑/存储库类的接口(我假设您目前没有,因为大多数人没有使用Web表单),您可以使用Ninject或另一个IoC容器,用于在旧式Web表单和MVC控制器中轻松实现此逻辑的接线,从而实现更好的结构和单点关注点;通常在您的App_Start()

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

我知道这不是你正在寻找的答案,有些可能会消失,但我认为重要的是退一步,看看你想要解决什么。如果我没有时间/资源来重构一些传统业务逻辑或接受已有的业务惯例,那么复杂化MVC的基本架构以适应您的方案会促使我拖延下去;从几个简单的控制器开始,以消除Web窗体应用程序中的痛点,并且,如果时间允许,开始将页面移植到MVC。临时可能不太好,但它会很简单。

这是一个非常好的问题,你做了很好的工作,通过扩展剃刀来调查你的选择。我很想看看其他人是否有偏离标准MVC文件夹约定的想法。也许我只是挑剔?

如果您的主要最终目标是让您的网站启用移动设备,最后一件事是Steve Sanderson的this article。它利用优秀的51Degrees.mobi程序集进行移动设备检测,并涵盖ASP.NET和ASP.NET MVC中的使用。桑德森在他的个人博客上也有类似的帖子,讲述同一主题。

+0

感谢亚当您的回答。 – Sam 2011-05-03 01:53:28

+1

感谢Adam的回答。我完全理解MVC是建立在约定之上的。其实,这是让我考虑转换的主要观点之一。但是,我们基于网络表单的解决方案有数百个按业务领域(会计/库存/生产/等)分组的网站。我有点惊讶,这还没有出现。我想,我要么必须接受这个半解决方案,要么采用常规惯例。 最后,感谢您指出Sanderson的文章。这是非常有教育意义的。 – Sam 2011-05-03 02:02:28

+0

这是商业领域的逻辑生活在类或* .aspx.cs文件?如果他们生活在课堂上,我会毫不犹豫地在我的项目中创建一个'\ services'文件夹,然后为每个商业领域创建子文件夹。提取接口,然后你会成为金。这种方式遵循奥斯汀Headspring的家伙概述的MVC架构,他们为Manning MVC in Action书籍做出了贡献。 – adammokan 2011-05-03 19:19:37