your programing

ASP.NET MVC 컨트롤러 메서드가 ActionResult를 반환해야합니까?

lovepro 2020. 12. 30. 19:51
반응형

ASP.NET MVC 컨트롤러 메서드가 ActionResult를 반환해야합니까?


ASP.NET MVC를 처음 접했기 때문에 Controller 메서드의 서명에 대해 궁금해했습니다. 내가 본 모든 예제에서 실제로 ViewResult 인스턴스 또는 이와 유사한 것을 반환하더라도 항상 ActionResult를 반환하는 것처럼 보입니다.

일반적으로 볼 수있는 예는 다음과 같습니다.

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

이 경우 메서드를로 선언하고 public ViewResult Index()더 강력한 유형 지원을받는 것이 더 합리적이지 않습니까?

실험 결과 이것이 효과가 있음을 나타내므로 가능해 보입니다.

다형성이 필요한 상황 (예 : 특정 상황에서만 리디렉션하고 다른 상황에서는 뷰를 표시하려는 경우)이있을 수 있지만 메서드가 항상 뷰를 반환하면 ViewResult를 더 많이 찾을 수 있습니다. 바람직한.

향후 호환성 측면에서 ActionResult는 분명히 더 강력한 서명을 제공하지만 전체 코드베이스를 제어하는 ​​경우 나중에 필요할 경우 메서드의 서명을보다 일반적인 반환 유형으로 변경할 수 있습니다.

내가 알지 못하는 다른 고려 사항이 있습니까? 아니면 특정 반환 유형으로 컨트롤러 메서드를 선언해야합니까?


웹상의 대부분의 예제가 ActionResult 를 반환하는 것처럼 보이지만 특정 반환 유형을 절대적으로 사용할 수 있습니다 . ActionResult 클래스를 반환하는 유일한 경우는 작업 메서드의 다른 경로가 다른 하위 유형을 반환하는 경우입니다.

Steven Sanderson은 또한 그의 저서 Pro ASP.NET MVC Framework 에서 특정 유형을 반환 할 것을 권장 합니다. 아래 인용문을 살펴보십시오.

"이 작업 메서드는 특히 ViewResult의 인스턴스를 반환한다고 선언합니다. 대신 메서드 반환 유형이 ActionResult (모든 작업 결과의 기본 클래스) 인 경우에도 동일하게 작동합니다. 실제로 일부 ASP.NET MVC 프로그래머는 액션 메서드는 항상 하나의 특정 하위 클래스를 반환한다는 것을 확실히 알고 있더라도 비 특정 ActionResult를 반환합니다. 그러나 메서드가 할 수있는 가장 구체적인 유형을 반환해야한다는 것은 객체 지향 프로그래밍에서 잘 확립 된 원칙입니다. 가능한 가장 일반적인 매개 변수 유형 허용).이 원칙을 따르면 단위 테스트와 같이 메소드를 호출하는 코드의 편의성과 유연성이 극대화됩니다. "


항상 반환 할 수있는 가장 정확한 유형을 반환합니다. 따라서 액션이 항상 뷰를 표시 할 때 ViewResult를 반환해야합니다. 어떤 경우에는 ViewResult에서 반환하거나 (잘못된 게시 된 데이터) 다른 경우에는 RedirectToRouteResult를 반환 할 때만 ActionResult를 사용합니다.

일부 고급 액션 필터 / 실행 시나리오를 사용하면 ActionResult와 관련이없는 완전히 다른 것을 반환 할 수도 있습니다.


[일부 답변] : 항상 ActionResult를 반환하지는 않습니다. 반환 할 수있는 다른 결과에 대한 빠른보기는 다음과 같습니다. http://msdn.microsoft.com/en-us/library/dd410269%28v=vs.98%29.aspx

아마 조금 도움이 될 것입니다. 행운을 빕니다!


예, 다음과 같이 작업을 정의 할 수 있습니다 public ViewResult Index(). 그러나 때로는 작업이 다른 결과를 반환 할 수 있습니다 (결과를 기본 ActionResult클래스 로 선언하지 않으면 불가능합니다 ). 예를 들면 :

public ActionResult Show()
{
    ...

    if(Request.IsAjaxRequest())
    {
        return PartialView(...);
    }

    return View(...);
}

또는:

public ActionResult Show()
{
    ...

    try
    {
        ...
    }
    catch(Exception)
    {
        return RedirectToAction(...);
    }

    return View(...);
}

ActionResult는 다양한 반환 유형에 대한 기본 클래스입니다. 따라서 작업이 작동하려면 ActionResult 또는 파생 된 클래스를 반환해야합니다 . 있는 일반적인 것들 ViewResult, JsonResult


네, 저는 샌더슨의 책을 가지고 있으며, 다른 컨트롤러 액션 예제를 볼 때 저를 짜증나게하는 부분 이었기 때문에 구체적이라는 부분이 마음에 들었습니다. MVC를 배우는 b4조차도 내 철학은 함수 (값을 반환하는 방법)를 마치 변수를 선언하는 것처럼 처리해야하고 / 동일한 유형의 변수 / 참조에 대한 컨텍스트에서 대체 가능해야하므로 유형에 대해 구체적으로 지정해야한다는 것입니다. var를 선언하는 경우 (앱에서 모든 변수를 "Object"유형으로 정의하는 것을 피하고 싶다고 생각하면 더 강력하지만 디자인 타임 검사 및 유형 안전성을 잃게됩니다). 올바른 반환 유형에 대한 컨트롤러 단위 테스트도 용이하게합니다.

관련 참조는 Listkov의 대체 원칙 ( "SOLID"의 "L")도 확인하십시오.

ReferenceURL : https://stackoverflow.com/questions/1021568/must-asp-net-mvc-controller-methods-return-actionresult

반응형