更改ASP.Net MVC目录结构

时间:2011-02-05 14:57:02

标签: asp.net-mvc routing

我一直在使用ASP.Net MVC(3)已经有一段时间了,我非常喜欢它。但有一点我觉得有点烦人的是必须始终在controllers / views / model / script目录之间浏览。所以我想知道是否有办法告诉MVC在不同的位置查找文件?

也许有人可以告诉我如何通过控制器简单地将文件分组在一起:

目录:/会员资格

  • MembershipController
  • LogOnView
  • LogOnModel
  • RegisterView
  • RegisterModel

亲切的问候 奥拉夫

5 个答案:

答案 0 :(得分:2)

我确切地知道你在谈论什么。以下是我发现默认MVC文件夹结构繁重的条件:

  • 我正在使用每视图模型方法
  • 我的控制器基本上只适用于那个特定的视图
  • 我有一些只适用于该视图的JavaScript

为什么我要将这些部分放在不同的文件夹中?

我在Views文件夹中为视图创建了一个文件夹,所以你有一个文件夹〜/ Views / MyEntityList(就像传统的MVC方法一样),但我把所有与该组件有关有:

  ~/Views/MyEntityList/
       MyEntityListController.cs
       MyEntityListModel.cs
       MyEntityList.js
       MyEntityList.aspx

我发现这种结构导致所有开发人员保持彼此分离的视图。除了允许浏览器直接访问.js资源外,不需要特殊的MVC配置。

有一些架构模式可能不是一个好方法。对于每个视图模型的方法(有关更多说明,请参阅Los Techies)我非常喜欢这种结构。

答案 1 :(得分:1)

我认为您需要通过VS 2010的Power Tools更新获得Solution Navigator扩展。

这样,您可以在解决方案导航器中显示,而不是解决方案资源管理器,例如,只显示打开的文件。使它更容易。

顺便说一下,删除所有模型文件夹并创建一个单独的模型项目,例如:

MyApp.Domain

任何超出基本的解决方案都将从中受益。

正如您对问题的评论中所述,区域也会降低您的导航要求。

答案 2 :(得分:1)

唯一的“查看文件”是视图,其他一切只是一个约定,所以如果你想要你可以有:

  

目录:/会员资格

     
      
  • MembershipController
  •   
  • LogOnView
  •   
  • LogOnModel
  •   
  • RegisterView
  •   
  • RegisterModel
  •   

...但视图必须位于~/Views/Membership

答案 3 :(得分:0)

看起来您必须覆盖视图引擎中的某些行为。您可以See this question获得更好的主意。

答案 4 :(得分:0)

我能想到实现这一目标的一种方法是编写自定义视图引擎。您可以将所有这些文件放在Controllers / Membership

  • MembershipController
  • LogOnView
  • LogOnModel
  • RegisterView
  • RegisterModel

模型不会是一个问题,您只需更改模型的命名空间,唯一的问题是视图。为此,编写自定义视图引擎,以便mvc应用程序知道视图文件的物理位置,如下所示。

 public class CustomViewEngine : RazorViewEngine
 {
    public CustomViewEngine()
    {
        ViewLocationFormats = new[]
         {
            "~/Controllers/{1}/{0}.cshtml",

        };
    }
 }

在global.asax.cs中,通过包含以下代码在Application_Start()中添加ViewEngine

 ViewEngines.Engines.Clear();
 ViewEngines.Engines.Add(new CustomViewEngine());

您可能还需要处理各种其他因素,例如根据放置_Layout.cshtml的位置更新“布局”属性。

如果您正在使用区域,请同时添加AreaViewLocationFormats字符串数组。

您可以通过覆盖某些方法(如FileExists,CreateView,CreatePartialView)来进行进一步的自定义。

注意:不要忘记将views文件夹中的web.config复制到Membership控制器。否则应用程序找不到所需的mvc名称空间,并且找不到像viewbag,model等符号。