ASP.NET MVC中的视图文件/目录结构应该是什么?
我对视图的组织方式感到困惑,理解这一点很重要,因为ASP.NET MVC使用约定来使一切正常工作。
在views目录下,有子目录。这些子目录中包含视图。我假设子目录映射到控制器,并且控制器根据其子目录中包含的视图进行操作。
人们对这些目录中包含哪些类型的视图有新的期望?例如,每个目录的默认页面应该是index.aspx吗?页面是否应遵循诸如Create [controller] .aspx,List [controller] .aspx等命名约定?还是没关系?
解决方案
视图目录命名和文件命名很重要,因为ASP.NET MVC框架对它们进行了某些假设。如果我们不遵守这些假设,则必须编写代码以使框架知道我们在做什么。一般来说,除非有充分的理由不这样做,否则我们应该遵守这些假设。
让我们看一下最简单的控制器动作:
public ActionResult NotAuthorized() { return View(); }
因为在对View()的调用中未指定视图名称,所以框架将假定视图文件名与操作名称相同。该框架具有一个称为ViewEngine的类型,它将提供扩展名。默认的ViewEngine是WebFormViewEngine,它将采用该名称并在其中添加一个.aspx。因此,在这种情况下,完整文件名将为NotAuthorized.aspx。
但是,将在哪个文件夹中找到该文件?同样,ViewEngine提供了该信息。使用WebFormViewEngine,它将在两个文件夹中查找:〜/ Views / Shared和〜/ Views / {controller}
因此,如果控制器名为AccountController,它将在〜/ Views / Account中查找
但是有时候我们可能不想遵守这些规则。例如,两个不同的动作可能会返回相同的视图(具有不同的模型或者其他内容)。在这种情况下,如果我们在操作中明确指定视图名称:
public ActionResult NotAuthorized() { return View("Foo"); }
请注意,对于WebFormViewEngine,"视图名称"通常与文件名相同,但扩展名较少,但是该框架不需要其他视图引擎。
同样,我们可能也有理由希望应用程序查找视图和非默认文件夹。我们可以通过创建自己的ViewEngine来做到这一点。我在此博客文章中介绍了该技术,但是类型名称有所不同,因为它是为框架的早期版本编写的。但是,基本思想仍然相同。
关于期望的视图名称,我认为这是每个项目或者组织都将尝试标准化的事情之一。
正如我们在问题中所暗示的那样,这些视图中的某些(或者更确切地说是呈现它们的动作)可能会在整个领域广泛流行,例如采用REST范式的RoR应用程序中常见的以下视图:
- / orders /(即索引)
- / orders / show / 123
- / orders / edit / 123
- / orders / update / 123
- /订单/新
- /订单/创建
- / orders / destroy / 123
视图的选择/标准化在很大程度上取决于我们对应用程序进行建模的方式(显而易见),以及我们希望进行的细化程度。我们将控制器映射到各个模型类(咳嗽...资源...咳嗽)越近,动作将越短,并且我们就越容易遵循一组标准的动作(如上例所示) )。
我还相信,较短的操作有助于将越来越多的模型业务逻辑推入模型所属的模型本身。