Sự khác biệt giữa ViewResult () và ActionResult ()


295

Sự khác biệt giữa ViewResult()ActionResult()trong ASP.NET MVC là gì?

public ViewResult Index()
{
    return View();
}

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

12
Câu hỏi tuyệt vời. Tôi đã xem một video và để tạo các bài kiểm tra đơn vị, người hướng dẫn trước tiên đã thay đổi kiểu trả về của Hành động mà anh ta sẽ kiểm tra từ ActionResult sang ViewResult. Không có lời giải thích .... Tôi giống như "Những gì chúng ta có thể thay đổi ngẫu nhiên các loại? Không có lời giải thích"
Doug Chamberlain

3
Có lẽ tài liệu này rất hữu ích :) msdn.microsoft.com/en-us/l
Library / trộm

Câu trả lời:


372

ActionResult là một lớp trừu tượng có thể có một vài kiểu con.

Các kiểu con ActionResult

  • 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

Tài nguyên


5
lợi thế của việc trả lại ViewResult so với ActionResult là gì - nó chỉ là một chút ngữ nghĩa và cho thấy ý định của bạn - nhưng trong thực tế thường không có sự khác biệt nào?
niico

121

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 JsonResultPartialViewResult .

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
}

2
Điều đó có nghĩa là chúng ta phải luôn trả lại ActionResult để chúng ta có được lợi thế của nó. Hoặc có bất kỳ hạn chế hoặc tác dụng phụ của điều này?
Adarsh ​​Kumar

5
@Adarsh ​​- nó giống với bất kỳ lớp trừu tượng nào trong C #. Khai báo theo cách đó nếu bạn muốn gói gọn việc triển khai bên trong phương thức hoặc muốn chứng minh API của mình trong tương lai để nhập. Nếu không, sử dụng bê tông. Tôi thường sử dụng bê tông (ví dụ: ViewResult hoặc JsonResult)
RPM1984

31

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ả.


Mã sạch hơn và kiểm tra đơn vị là lợi ích của việc sử dụng ViewResult dựa trên kinh nghiệm của tôi.
JoshYates1980

20

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.


11

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?


4

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 ViewResulttrong 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 ViewResultlà một lớp con của ActionResult.


4
Tôi không chắc đây có phải ý bạn không, nhưng chỉ trong trường hợp tôi muốn làm rõ rằng bạn không thể có hai phương thức đó cùng một lúc, vì tên của chúng và (không) tham số giống nhau. Không thể quá tải một phương thức bằng cách chỉ thay đổi loại kết quả.
Andrew

0

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.


0

Để 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ề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.