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