2008-09-24 64 views
8

我对视图的组织方式感到困惑,而且理解这一点很重要,因为ASP.NET MVC使用约定来使所有的工作都正常工作。ASP.NET MVC中的视图文件/目录结构应该是什么?

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

这些目录中包含哪些类型的视图是否有新的期望?例如,每个目录的默认页面应该是index.aspx?页面是否遵循命名约定,如Create [controller] .aspx,List [controller] .aspx等?或者没有关系?

回答

7

查看目录的命名和文件命名非常重要,因为ASP.NET MVC框架对它们做了某些假设。如果你不符合这些假设,那么你必须编写代码让框架知道你在做什么。一般来说,除非你有充分理由不遵守,否则你应该遵守这些假设。

让我们看看最简单的可能控制器操作:

public ActionResult NotAuthorized() 
    { 
     return View(); 
    } 

因为没有视图名称已在调用指定查看(),该框架将推定视图文件名将是一样的行动名称。该框架有一个名为ViewEngine的类型,它将提供扩展。默认的ViewEngine是WebFormViewEngine,它将使用该名称并向它附加一个.aspx。所以在这种情况下,完整的文件名将是NotAuthorized.aspx。

但是在哪个文件夹中会找到该文件?再次,ViewEngine提供这些信息。随着WebFormViewEngine,它将在两个文件夹:〜/查看/共享和〜/查看/ {控制器}

所以,如果你的控制器被称为的AccountController,它看起来在〜/查看/帐户

但有可能是你不想遵守这些规则的时候。例如,两个不同的动作可能会返回相同的视图(使用不同的模型或其他东西)。在这种情况下,如果你在你的行动明确指定视图名称:

public ActionResult NotAuthorized() 
    { 
     return View("Foo"); 
    } 

注意与WebFormViewEngine,在“视图名称”通常是相同的文件名,扩展名少,但框架不需要其他视图引擎。

同样,您可能也有理由希望您的应用程序查找视图和非默认文件夹。你可以通过创建你自己的ViewEngine来做到这一点。我在this blog post中展示了这种技术,但是类型名称是不同的,因为它是为较早版本的框架编写的。然而,基本的想法仍然是一样的。

+0

视图中的文件夹可以包含子文件夹吗?如果是这样,主计长如何接触他们?例如... Admin/Profile/Edit/1 – 2009-02-10 16:46:28

2

关于预期的意见名称,我认为这是每个项目或组织试图标准化的事情之一。

正如你在你的问题中暗示的那样,这些视图中的一些(或者更确切地说是渲染它们的动作)可能全面受欢迎,例如在RoR应用程序中常见的那些视图REST范例:

  • /orders /(ie指数)
  • /命令/显示/ 123
  • /命令/编辑/ 123
  • /命令/更新/ 123
  • /命令/新
  • /命令/创建
  • /命令/销毁/ 123

选择/视图的标准化,在很大程度上取决于你如何建模应用程序(的说法明显),以及如何细粒度你想去的地方。将控制器映射到单独的模型类(咳嗽...资源......咳嗽)越近,您的动作就会越短,并且更容易您可以遵循标准操作(如上例所示)。

我还认为,较短的操作有助于将越来越多的模型业务逻辑推入模型本身,它属于哪里。

相关问题