改变ASP.Net MVC目录结构

3

我已经使用ASP.Net MVC(3)一段时间了,非常喜欢它。但有一件事让我有点烦恼,就是不得不一直在控制器/视图/模型/脚本目录之间浏览。所以我想知道是否有办法告诉MVC在不同的位置查找文件?

也许有人可以告诉我如何简单地按控制器将文件组合在一起,例如:

目录:/Membership

  • MembershipController
  • LogOnView
  • LogOnModel
  • RegisterView
  • RegisterModel

祝好 Olav


@Kirk 我认为即使使用了MVC区域,你仍然需要每个区域中的控制器/视图/模型供他浏览。 - Mahesh Velaga
1
安装Resharper。使用Idea快捷键可以通过按下ctrl-N键转到控制器或视图等,然后开始输入名称并从列表中选择即可。你的工具可以让生活变得更加轻松。但遗憾的是它不适用于脚本 :-/ - Sean
@Sean DPack使用alt-u也可以实现同样的功能。它是免费的,而且还支持脚本。 - Quesi
是的,区域在这里并不真正适合。至于工具,它们可能会减轻痛苦,但我觉得LoginModel和LoginView有更多共同点,而不是像LoginView和ProductView这样的内容,所以能够把它们放在同一个文件夹中会很好 :) - t0PPy
1
就脚本而言,似乎可以将它们与视图一起放置。http://www.lazycoder.com/weblog/2009/03/17/aspnet-mvc-tip-dont-use-the-content-or-scripts-directories-for-view-specific-files/ - t0PPy
显示剩余3条评论
5个回答

2
我知道你在说什么。以下是我发现默认的MVC文件夹结构繁琐的条件:
  • 我正在使用每个视图一个模型的方法
  • 我的控制器基本上只与那个特定的视图一起工作
  • 我有一些仅涉及该视图的JavaScript代码
为什么我要将这些部分放在不同的文件夹中呢?
我在Views文件夹中为视图创建了一个文件夹,因此您可以在~/Views/MyEntityList中找到一个文件夹(就像传统的MVC方法一样),但我把与该组件相关的所有内容都放在那里:
  ~/Views/MyEntityList/
       MyEntityListController.cs
       MyEntityListModel.cs
       MyEntityList.js
       MyEntityList.aspx

我发现这种结构可以使所有开发人员将视图彼此解耦。除了允许浏览器直接访问.js资源之外,不需要任何特殊的MVC配置。
在某些架构模式下,这可能不是一个好的选择。对于一种基于模型-视图的方法(有关更多描述,请参见Los Techies),我非常喜欢这种结构。

1
我认为你需要通过Power Tools更新获取Solution Navigator扩展程序,以适用于VS 2010。
这样,你就可以在Solution Navigator中显示打开的文件,而不是解决方案资源管理器。这样做会更容易。
顺便说一下,删除所有模型文件夹并创建一个单独的模型项目,例如:
MyApp.Domain

任何超越基本的解决方案都将受益于此。
如您问题中的评论所述,区域还将减少您的导航要求。

1

唯一涉及“文件查找”的是视图,其他都只是一种约定,因此如果您想要,可以有:

目录:/Membership

  • MembershipController
  • LogOnView
  • LogOnModel
  • RegisterView
  • RegisterModel

...但视图必须在~/Views/Membership中。


不,视图可以放在任何地方。你只是无法像通常一样获得漂亮的路径搜索。你可以为视图指定任何路径到任何地方。 - Erik Funkenbusch
@Mystere Man:是的,您可以使用绝对路径。我说的是框架如何定位文件,所以除非您使用绝对路径,否则视图必须在~/Views中。 - Max Toro

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的位置更新Layout属性。

如果使用区域,请添加AreaViewLocationFormats字符串数组。

您可以通过重写一些方法(如FileExists、CreateView、CreatePartialView)进行进一步的自定义。

注意:不要忘记将views文件夹中的web.config复制到Membership控制器中。否则应用程序无法找到所需的mvc命名空间,也无法找到类似viewbag、model等符号。


0

看起来你需要重写视图引擎中的一些行为。你可以查看这个问题以获得更好的理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接