Asp.net mvc ASP.NET MVC中的视图文件/目录结构应该是什么?

Asp.net mvc ASP.NET MVC中的视图文件/目录结构应该是什么?,asp.net-mvc,directory-structure,Asp.net Mvc,Directory Structure,我对视图的组织方式感到困惑,理解这一点很重要,因为ASP.NET MVC使用约定使一切正常工作 在视图目录下,有子目录。在这些子目录中是视图。我假设子目录映射到控制器,并且控制器作用于其子目录中包含的视图 对于这些目录中包含哪些类型的视图,是否有新的期望?例如,每个目录的默认页面应该是index.aspx吗?页面是否应遵循命名约定,如创建[controller].aspx、列表[controller].aspx等?还是没关系?查看目录命名和文件命名很重要,因为ASP.NET MVC框架对它们进行

我对视图的组织方式感到困惑,理解这一点很重要,因为ASP.NET MVC使用约定使一切正常工作

在视图目录下,有子目录。在这些子目录中是视图。我假设子目录映射到控制器,并且控制器作用于其子目录中包含的视图


对于这些目录中包含哪些类型的视图,是否有新的期望?例如,每个目录的默认页面应该是index.aspx吗?页面是否应遵循命名约定,如创建[controller].aspx、列表[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应用程序中很常见:

  • /订单/(即指数)
  • /订单/展示/123
  • /订单/编辑/123
  • /订单/更新/123
  • /订单/新订单
  • /订单/创建
  • /命令/销毁/123
视图的选择/标准化在很大程度上取决于您对应用程序建模的方式(可以说是显而易见的)以及您希望实现的细粒度。将控制器映射到单个模型类(cough…resources…cough)的距离越近,您的操作就越短,也就越容易遵循标准的操作集(如上面的示例所示)


我还认为,较短的操作有助于将越来越多的模型业务逻辑推送到模型本身所属的位置。

视图中的文件夹是否可以有子文件夹?如果是,控制器如何与他们联系?例如Admin/Profile/Edit/1要做到这一点,您必须编写自己的ViewEngine。WebFormViewEngine找不到它们。@在Web表单视图引擎实例上设置
ViewLocationFormats
,就可以将视图放入子文件夹中。