TOC

This article is currently in the process of being translated into Chinese (~64% done).

Views:

View Discovery: Connecting Controller & View

在本系列教程的开头部分,我描述了一下控制器是如何通过简单地调用一下View()方法就能返回一个视图的。你甚至都不需要向View()方法传参。因此,在那个时候,你可能想知道这世上的控制器是怎么准确地知道一个特定的Action要返回哪个视图的。答案就是 视图查找 —— ASP.NET MVC框架用来猜测要用哪个视图的过程,无需你强制指定视图。

当你按照约定创建你的项目结构时,视图查找就发挥作用了。我们在之前的教程中已经说过了,我们总是应该把控制器放在一个名为"Controllers"的文件夹中,把模型放在一个名为"Models"的文件夹中,以此类推。对于视图,你应该把它们放在以控制器命名的子文件夹中。同时,视图的名称应该与控制器中对应的Action的命名一致。例如,如果你创建了一个名为"ProductController"的控制器,里面有一个名为"Details"的Action,你的文件夹结构看起来就是这样的:

换句话说,你的视图文件存放的位置和命名应该遵守如下约定:

/Views/[控制器名称]/[Action名称].cshtml

如果满足了上述约定的条件,你就可以在你控制器的Action中,简单地调用View()方法,这样.NET framework就会自动为你定位合适的视图。

public class ProductController : Controller
{
public IActionResult Index()
{
    return View();
}

public IActionResult Details()
{
return View();
}
}

如果.NET framework无法按照上面的约定找到对应的视图,那么它还会再找一个位置:

/Views/Shared/[Action名称].cshtml

你可能会在你的Views文件夹中添加Shared文件夹,它通常用于存放布局文件以及由多个控制器之间共享的部分视图。我们后续再讨论这些东西,现在,最容易做的就是遵守上面标出来的那些约定。

指定一个视图

如果你无法(或者根本不想)遵守上面提到的约定,那么你就需要通过向View()方法传参来帮助.NET framework匹配视图。有两种方法:第一种,仅仅指定视图的名称,不过你还是得遵守前面说的文件夹结构约定,但这次你可以把视图的名称改了(把它看成是别名吧),像下面这样:

public IActionResult Test()
{
return View("Details");
}

第二种方法是提供完整的路径,这样一来你就可以完全灵活地创建你的项目结构:

public IActionResult Test()
{
return View("/ViewFolderName/SomeFolderName/ViewName.cshtml");
}

总结

如果你在创建项目结构的时候遵守了上述提到的约定,视图查找就能根据控制器和Action的名称自动找到对应的视图。如果你没遵守,你也可以很容易地通过向View()方法传入视图路径或名称的参数来返回一个指定的视图。


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!