我一直在使用ASP.Net MVC(3)已经有一段时间了,我非常喜欢它。但有一点我觉得有点烦人的是必须始终在controllers / views / model / script目录之间浏览。所以我想知道是否有办法告诉MVC在不同的位置查找文件?
也许有人可以告诉我如何通过控制器简单地将文件分组在一起:
目录:/会员资格
亲切的问候 奥拉夫
答案 0 :(得分:2)
我确切地知道你在谈论什么。以下是我发现默认MVC文件夹结构繁重的条件:
为什么我要将这些部分放在不同的文件夹中?
我在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
中模型不会是一个问题,您只需更改模型的命名空间,唯一的问题是视图。为此,编写自定义视图引擎,以便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等符号。