ViewResult ()와 ActionResult ()의 차이점


295

의 차이 무엇입니까 ViewResult()ActionResult()ASP.NET MVC의는?

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

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

12
좋은 질문입니다. 비디오를보고 단위 테스트를 만들기 위해 강사가 먼저 테스트하려는 동작의 반환 유형을 ActionResult에서 ViewResult로 변경했습니다. 어떤 설명이 .... 나는? "우리가 무작위로 아무 설명과 유형을 변경할 수있는 것"처럼 없었다
더그의 전관

3
아마도이 문서가 도움이 :)입니다 msdn.microsoft.com/en-us/library/...
user3885927는

답변:


372

ActionResult는 여러 하위 유형을 가질 수있는 추상 클래스입니다.

ActionResult 하위 유형

  • ViewResult- 지정된 뷰를 응답 스트림에 렌더링

  • PartialViewResult- 지정된 부분 뷰를 응답 스트림에 렌더링합니다.

  • EmptyResult- 빈 응답이 반환됩니다

  • RedirectResult- 지정된 URL로 HTTP 리디렉션을 수행합니다.

  • RedirectToRouteResult- 지정된 경로 데이터를 기반으로 라우팅 엔진에 의해 결정된 URL로 HTTP 리디렉션을 수행합니다.

  • JsonResult- 주어진 ViewData 객체를 JSON 형식으로 직렬화

  • JavaScriptResult- 클라이언트에서 실행할 수있는 JavaScript 코드를 반환합니다.

  • ContentResult- 보기없이 컨텐츠를 응답 스트림에 씁니다.

  • FileContentResult- 파일을 클라이언트에 반환

  • FileStreamResult- 파일을 클라이언트에 반환합니다.

  • FilePathResult- 클라이언트에 파일을 반환

자원


5
ActionResult에 비해 ViewResult를 반환하는 이점은 무엇입니까-조금 더 의미적이고 의도를 보여 주지만 실제로는 차이가 없습니까?
niico

121

ActionResult 는 추상 클래스입니다.

ViewResultActionResult 에서 파생됩니다 . 다른 파생 클래스로는 JsonResultPartialViewResult가 있습니다.

이 방법으로 선언하면 다형성을 이용하고 동일한 방법으로 다른 유형을 반환 할 수 있습니다.

예 :

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}

2
그것은 우리가 그것을 활용하기 위해 항상 ActionResult를 반환해야한다는 것을 의미합니까? 아니면 이것의 제한이나 부작용이 있습니까?
Adarsh ​​Kumar

5
@Adarsh-C #의 추상 클래스와 동일합니다. 메소드 내에서 구현을 캡슐화하거나 다른 파생 된 유형의 API를 나중에 증명하려는 경우이를 그렇게 선언하십시오. 그렇지 않은 경우 콘크리트를 사용하십시오. 나는 일반적으로 콘크리트를 사용합니다 (예 : ViewResult 또는 JsonResult)
RPM1984

31

"object"를 리턴하기 위해 모든 클래스의 모든 메소드를 작성하지 않는 것과 같은 이유입니다. 최대한 구체적이어야합니다. 단위 테스트를 작성하려는 경우 특히 유용합니다. 더 이상 반환 유형을 테스트하거나 결과를 캐스팅하지 않아도됩니다.


더 깨끗한 코드와 단위 테스트는 내 경험에 따라 ViewResult를 사용하는 이점입니다.
JoshYates1980

20

ViewResult는 ActionResult의 하위 클래스입니다. View 메서드는 ViewResult를 반환합니다. 실제로이 두 코드 스 니펫은 똑같은 작업을 수행합니다. 유일한 차이점은 ActionResult 하나의 경우 컨트롤러가보기를 반환 할 것이라고 약속하지 않는다는 것입니다. 메소드 정의를 변경하지 않고 조건부로 RedirectResult 또는 다른 것을 반환하도록 메소드 본문을 변경할 수 있습니다.


11

다른 답변에서 차이점을 올바르게 지적했지만 실제로 ViewResult를 반환하는 경우 기본 ActionResult 유형이 아닌 더 구체적인 유형 만 반환하는 것이 좋습니다. 이 원칙에 대한 명백한 예외는 메소드가 ActionResult에서 파생 된 여러 유형을 리턴하는 경우입니다.

이 원칙 뒤에있는 이유에 대한 자세한 내용은 관련 토론을 참조하십시오. ASP.NET MVC 컨트롤러 메서드가 ActionResult를 반환해야합니까?


4

컨트롤러에서 아래 구문을 사용할 수 있습니다

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

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

위의 예에서는 반환 유형 만 다릅니다. 하나는 반환 ViewResult하지만 다른 하나는 반환합니다 ActionResult.

ActionResult는 추상 클래스입니다. 받아 들일 수 있습니다 :

ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult 등

ViewResult하위 클래스입니다 ActionResult.


4
이것이 당신이 의미하는 바인지 확실하지 않지만, 이름과 (아니요) 매개 변수가 동일하기 때문에 두 가지 방법을 동시에 가질 수 없다는 것을 분명히하기 위해서입니다. 결과 유형 만 변경하여 메소드를 오버로드 할 수 없습니다.
Andrew

0

컨트롤러 i에서 ViewResult, PartialViewResult, EmptyResult, RedirectResult, RedirectToRouteResult, JsonResult, JavaScriptResult, ContentResult, FileContentResult, FileStreamResult, FilePathResult와 같이 MVC에서 11 개의 하위 유형을 가질 수있는 기본 클래스 인 ActionResult로 아래 코드를 지정했습니다.

    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
    }

마찬가지로 모든 하위 유형 메소드를 명시 적으로 지정하지 않고 ActionResult ()를 사용하여이 11 개의 하위 유형을 모두 리턴 할 수 있습니다. 다른 유형의 뷰를 반환하는 경우 ActionResult가 가장 좋습니다.


0

시간을 절약하기 위해 https://forums.asp.net/t/1448398.aspx 의 이전 답변에있는 링크의 답변입니다.

ActionResult는 추상 클래스이며 ViewResult 클래스의 기본 클래스입니다.

MVC 프레임 워크에서는 ActionResult 클래스를 사용하여 조치 메소드가 리턴하는 오브젝트를 참조합니다. 그리고 ExecuteResult 메소드를 호출합니다.

그리고 ViewResult는이 추상 클래스에 대한 구현입니다. 주어진 뷰 이름으로 미리 정의 된 경로 (/ views / controllername /, / views / shared / 등)에서 뷰 페이지 (보통 aspx 페이지)를 찾으려고 시도합니다.

일반적으로 메소드가 더 구체적인 클래스를 리턴하도록하는 것이 좋습니다. 따라서 액션 메서드가 일부 뷰 페이지를 반환한다고 확신하는 경우 ViewResult를 사용할 수 있습니다. 그러나 작업 방법에 따라 뷰를 렌더링하거나 리디렉션을 수행하는 등의 동작이 다를 수 있습니다. 보다 일반적인 기본 클래스 ActionResult를 반환 유형으로 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.