我对视图的组织方式感到困惑,理解这一点很重要,因为 ASP.NET MVC 使用约定来让一切正常工作。
在views 目录下,有子目录。在这些子目录中是视图。我假设子目录映射到控制器,并且控制器作用于其子目录中包含的视图。
是否对这些目录中包含哪些类型的视图有新的期望?例如,每个目录的默认页面是否应该是 index.aspx?页面是否应该遵循 Create[controller].aspx、List[controller].aspx 等命名约定?还是没关系?
我对视图的组织方式感到困惑,理解这一点很重要,因为 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 应用程序中常见的视图:
视图的选择/标准化在很大程度上取决于您如何为应用程序建模(很明显)以及您想要的细粒度。将控制器映射到各个模型类(咳嗽...资源...咳嗽)越接近,您的操作就越短,您将能够更容易地遵循一组标准操作(如上面的示例)。
我还相信,更短的操作有助于将越来越多的模型业务逻辑推入模型本身,也就是它所属的地方。