This article is currently in the process of being translated into Vietnamese (~96% done).
View Discovery: Connecting Controller & View
Từ đầu bài giảng, tôi đã minh họa cách một Controller có thể trả về một View đơn giản bằng cách gọi phương thức View(). Phương thức này không cần tham số, vậy tới đây bạn có thể đặt câu hỏi một Controller làm sao có thể biết chính xác View nào cho Action nào. Câu trả lời là View Discovery - là quá trình mà ASP.NET MVC sẽ thử đoán View, mà không cần bạn phải chỉ ra.
View Discovery hoạt động khi bạn theo một quy trình cụ thể khi tạo ra cấu trúc dự án. Chúng ta đã nói trước đây là ta luôn đặt Controller trong một thư mục tên là Controllers, Model trong thư mục Models ... Với View, bạn nên đặt chúng trong thư mục con đặt tên theo Controller và tên file của View nên trùng tên với Action. Ví dụ, nếu bạn có một Controller tên là ProductController với action tên "Details", thì thư mục của bạn nên như sau:
Hay nói cách khác, vị trí và cách đặt tên cho View nên theo quy tắc:
/Views/[Controller Name]/[Action Name].cshtml
Nếu đúng như vậy thì ban có thể đơn giản gọi phương thức View() từ Controller và .NET framework sẽ xác định đúng View cho bạn:
public class ProductController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Details()
{
return View();
}
}
Nếu framework không thể tìm thấy View phù hợp thì nó sẽ tìm ở trong vị trí sau:
/Views/Shared/[Action Name].cshtml
Thư mục Shared, mà bạn có thể tạo ra trong thư mục Views, thường được dùng cho tệp Layout và partial view có thể chia sẻ cho nhiều controller. Chúng ta sẽ bàn sau, nhưng bây giờ, dễ nhất là theo cấu trúc thư mục trên.
Chỉ định View
Nếu không thể làm như vậy, bạn có thể giúp framework tìm ra View bằng cách cung cấp tham số cho phương thức View(). Có hai cách: bạn có thể chỉ ra tên, tức là vẫn theo cấu trúc thư mục, nhưng thêm View vơi tên khác (định danh) như sau:
public IActionResult Test()
{
return View("Details");
}
Hoặc bạn có thể cung cấp toàn bộ đường dẫn, có tính linh động hơn với dự án:
public IActionResult Test()
{
return View("/ViewFolderName/SomeFolderName/ViewName.cshtml");
}
Kết luận:
Nếu bạn theo đúng quy tắc, View Discovery sẽ cho phép Controller tự động tìm thấy View dựa vào tên của Controller và Action. Nếu không thì bạn cũng có thể trả về một View cụ thể bằng cách truyền vào đường dẫn hoặc tên vào phương thức View().