ASP.NET MVC Tip #22 -- Trả về View mà không cần tạo Controller Action
Bài đăng này đã không được cập nhật trong 6 năm
Trong mẹo này, tôi trình bày cách bạn có thể loại bỏ các controller method đơn giản là trả về các view. Tôi chỉ cho bạn cách sử dụng phương thức HandleUnknownAction.
Tôi phát hiện ra rằng tôi viết rất nhiều controller action không làm gì hơn là trả về một view. Ví dụ, hãy xem xét CustomerController trong Liệt kê 1.
Listing 1 – CustomerController.vb
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.Mvc
Namespace Tip22.Controllers
Public Class CustomerController
Inherits Controller
Public Function Index() As ActionResult
Return View()
End Function
Public Function Details() As ActionResult
Return View()
End Function
Public Function Help() As ActionResult
Return View()
End Function
End Class
End Namespace
Listing 1 – CustomerController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Tip22.Controllers
{
public class CustomerController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Details()
{
return View();
}
public ActionResult Help()
{
return View();
}
}
}
Controller này bao gồm ba actions trả về ba views khác nhau. Mỗi action này chứa một dòng mã. Trong thực tế, mỗi action này chứa chính xác cùng một dòng mã. Mã này thực sự không làm điều cần thiết. Làm thế nào chúng ta có thể sửa chữa nó?
Lớp Controller bao gồm một action, có tên là phương thức HandleUnknownAction(), thực hiện bất cứ khi nào bạn cố gắng gọi một action trên một Controller không tồn tại. Controller trong Liệt kê 2 tận dụng phương thức HandleUnknownAction() để render các views ngay cả khi một controller method tương ứng không tồn tại.
Listing 2 – HomeController.vb
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.Mvc
Namespace Tip22.Controllers
<HandleError> _
Public Class HomeController
Inherits Controller
Public Function Details() As ActionResult
ViewData("message") = "Hello from controller action!"
Return View()
End Function
Protected Overrides Sub HandleUnknownAction(ByVal actionName As String)
Me.View(actionName).ExecuteResult(Me.ControllerContext)
End Sub
End Class
End Namespace
Listing 2 – HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Tip22.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Details()
{
ViewData["message"] = "Hello from controller action!";
return View();
}
protected override void HandleUnknownAction(string actionName)
{
this.View(actionName).ExecuteResult(this.ControllerContext);
}
}
}
Khi bạn sử dụng controller trong Liệt kê 2, bạn có thể gọi bất kỳ action nào và controller sẽ cố gắng trả về một view tương ứng với hành động đó. Bạn không cần phải code rõ ràng action method cho mỗi view.
Lưu ý rằng bộ controllerbao gồm một action Details(). Khi bạn cần truyền ViewData, thì bạn cần phải code một cách rõ ràng action method.
All rights reserved