【问题标题】:Changing ASP.Net MVC directory structure更改 ASP.Net MVC 目录结构
【发布时间】:2011-02-05 14:57:01
【问题描述】:

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

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

目录:/会员

  • 会员控制器
  • 登录查看
  • Lo​​gOnModel
  • 注册查看
  • 注册模型

亲切的问候 奥拉夫

【问题讨论】:

  • 我想你对 MVC 领域很感兴趣:msdn.microsoft.com/en-us/library/ee671793.aspx
  • @Kirk 我认为即使在使用 MVC 区域之后,他需要浏览的每个区域中仍然有控制器/视图/模型。
  • 安装 Resharper。要转到控制器或视图等(使用 Idea 键绑定),您只需按 ctrl-N 并开始输入名称,然后从列表中选择。您的工具让生活更轻松。不幸的是,它不适用于脚本:-/
  • @Sean DPack 用 alt-u 做同样的事情。它是免费的,也可以与脚本一起使用。
  • 就脚本而言,您似乎可以将它们与视图一起放入。lazycoder.com/weblog/2009/03/17/…

标签: asp.net-mvc routing


【解决方案1】:

我完全知道你在说什么。以下是我发现默认 MVC 文件夹结构繁重的情况:

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

我为什么要将这些片段中的每一个放在不同的文件夹中?

我在 Views 文件夹中为视图创建了一个文件夹,因此您有一个文件夹 ~/Views/MyEntityList(就像传统的 MVC 方法一样),但我将与该组件相关的 所有内容那里:

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

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

在某些架构模式中,这可能不是一个好方法。对于每视图模型的方法(有关详细说明,请参阅Los Techies),我真的很喜欢这种结构。

【讨论】:

    【解决方案2】:

    我认为您需要通过 VS 2010 的 Power Tools 更新来获取解决方案导航器扩展。

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

    顺便把所有模型文件夹删除,单独创建一个模型项目,eg:

    MyApp.Domain
    

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

    正如您问题的 cmets 中所述,Areas 也会降低您的导航要求。

    【讨论】:

      【解决方案3】:

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

      目录:/会员

      • 会员控制器
      • 登录查看
      • Lo​​gOnModel
      • 注册查看
      • 注册模型

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

      【讨论】:

      • 不,视图可以在任何地方。你只是没有得到你通常得到的好路径搜索。您可以为视图指定任意路径。
      • @Mystere Man:是的,您可以使用绝对路径。我说的是框架如何定位东西,所以除非你使用绝对路径,否则视图必须在~/Views
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        • MembershipController
        • 登录查看
        • Lo​​gOnModel
        • 注册查看
        • 注册模型

        模型不是问题,您可以简单地更改模型的命名空间,唯一的问题是视图。为此编写您的自定义视图引擎,以便您的 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 等符号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-04
          • 2016-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多