Sự khác biệt giữa ViewResult()
và ActionResult()
trong ASP.NET MVC là gì?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Sự khác biệt giữa ViewResult()
và ActionResult()
trong ASP.NET MVC là gì?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
Câu trả lời:
ActionResult là một lớp trừu tượng có thể có một vài kiểu con.
ViewResult - Hiển thị chế độ xem được chỉ định cho luồng phản hồi
PartialViewResult - Hiển thị chế độ xem một phần được chỉ định cho luồng phản hồi
EmptyResult - Một phản hồi trống được trả về
RedirectResult - Thực hiện chuyển hướng HTTP đến một URL được chỉ định
RedirectToRouteResult - Thực hiện chuyển hướng HTTP đến một URL được xác định bởi công cụ định tuyến, dựa trên dữ liệu tuyến đường đã cho
JsonResult - Tuần tự hóa một đối tượng ViewData đã cho thành định dạng JSON
JavaScriptResult - Trả về một đoạn mã JavaScript có thể được thực thi trên máy khách
ContentResult - Ghi nội dung vào luồng phản hồi mà không yêu cầu chế độ xem
FileContentResult - Trả về một tệp cho khách hàng
FileStreamResult - Trả về một tệp cho máy khách, được cung cấp bởi một luồng
FilePathResult - Trả lại một tệp cho khách hàng
ActionResult là một lớp trừu tượng.
ViewResult bắt nguồn từ ActionResult . Các lớp dẫn xuất khác bao gồm JsonResult và PartialViewResult .
Bạn khai báo theo cách này để bạn có thể tận dụng tính đa hình và trả về các loại khác nhau trong cùng một phương thức.
ví dụ:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
Vì lý do tương tự, bạn không viết mọi phương thức của mọi lớp để trả về "đối tượng". Bạn nên càng cụ thể càng tốt. Điều này đặc biệt có giá trị nếu bạn dự định viết bài kiểm tra đơn vị. Không có thêm các loại trả về thử nghiệm và / hoặc đúc kết quả.
ViewResult là một lớp con của ActionResult. Phương thức View trả về ViewResult. Vì vậy, thực sự hai đoạn mã này làm điều tương tự chính xác. Sự khác biệt duy nhất là với ActionResult, bộ điều khiển của bạn không hứa sẽ trả về một khung nhìn - bạn có thể thay đổi thân phương thức để trả về một cách có điều kiện một RedirectResult hoặc một cái gì đó khác mà không thay đổi định nghĩa phương thức.
Mặc dù các câu trả lời khác đã ghi nhận sự khác biệt một cách chính xác, lưu ý rằng nếu trên thực tế bạn chỉ trả về ViewResult thì tốt hơn là trả về loại cụ thể hơn thay vì loại ActionResult cơ bản. Một ngoại lệ rõ ràng cho nguyên tắc này là khi phương thức của bạn trả về nhiều loại xuất phát từ ActionResult.
Để thảo luận đầy đủ về các lý do đằng sau nguyên tắc này, vui lòng xem phần thảo luận liên quan tại đây: Phải có Phương thức bộ điều khiển ASP.NET MVC Trả về ActionResult?
Trong Bộ điều khiển, người ta có thể sử dụng cú pháp dưới đây
public ViewResult EditEmployee() {
return View();
}
public ActionResult EditEmployee() {
return View();
}
Trong ví dụ trên, chỉ có loại trả về thay đổi. một lợi nhuận ViewResult
trong khi một lợi nhuận khác ActionResult
.
ActionResult là một lớp trừu tượng. Nó có thể chấp nhận:
ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult, v.v.
Đây ViewResult
là một lớp con của ActionResult
.
Trong Trình điều khiển, tôi đã chỉ định mã dưới đây với ActionResult, đây là lớp cơ sở có thể có 11 kiểu con trong MVC như: ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, FileRultult, FileRultult, FileRultult
public ActionResult Index()
{
if (HttpContext.Session["LoggedInUser"] == null)
{
return RedirectToAction("Login", "Home");
}
else
{
return View(); // returns ViewResult
}
}
//More Examples
[HttpPost]
public ActionResult Index(string Name)
{
ViewBag.Message = "Hello";
return Redirect("Account/Login"); //returns RedirectResult
}
[HttpPost]
public ActionResult Index(string Name)
{
return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
}
Tương tự như vậy, chúng ta có thể trả về tất cả 11 kiểu con này bằng cách sử dụng ActionResult () mà không chỉ định rõ ràng mọi phương thức kiểu con. ActionResult là điều tốt nhất nếu bạn quay lại các kiểu xem khác nhau.
Để giúp bạn tiết kiệm thời gian ở đây là câu trả lời từ một liên kết trong câu trả lời trước tại https://forums.asp.net/t/1448398.aspx
ActionResult là một lớp trừu tượng và là lớp cơ sở cho lớp ViewResult.
Trong khung MVC, nó sử dụng lớp ActionResult để tham chiếu đối tượng mà phương thức hành động của bạn trả về. Và gọi phương thức ExecuteResult trên đó.
Và ViewResult là một triển khai cho lớp trừu tượng này. Nó sẽ cố gắng tìm một trang xem (thường là trang aspx) trong một số đường dẫn được xác định trước (/ lượt xem / tên người dùng /, / lượt xem / chia sẻ /, v.v.) bằng tên xem đã cho.
Đó thường là một cách thực hành tốt để phương thức của bạn trả về một lớp cụ thể hơn. Vì vậy, nếu bạn chắc chắn rằng phương thức hành động của bạn sẽ trả về một số trang xem, bạn có thể sử dụng ViewResult. Nhưng nếu phương thức hành động của bạn có thể có hành vi khác nhau, như hiển thị chế độ xem hoặc thực hiện chuyển hướng. Bạn có thể sử dụng ActionResult lớp cơ sở tổng quát hơn làm kiểu trả về.