문제

ASP.NET MVC에 익숙하지 않은 컨트롤러 방법의 서명에 대해 궁금해했습니다. 내가 본 모든 예에서, 그들은 실제로 ViewResult 인스턴스를 반환하더라도 ActionResult를 항상 반환하는 것처럼 보입니다.

일반적으로 보이는 예는 다음과 같습니다.

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

그러한 경우 방법을 public ViewResult Index(), 더 강력한 유형 지원을 받으시겠습니까?

실험은 이것이 작동한다는 것을 나타냅니다.

나는 다형성이 원하는 상황이있을 수 있음을 알고 있습니다 (예 : 특정 상황에서만 리디렉션하려는 경우 다른 상황에서는보기를 표시하는 경우). 언제나 견해를 반환하면 볼이 더 바람직한 견해를 찾을 수 있습니다.

향후 호환성 측면에서 ActionResult는 분명히보다 강력한 서명을 제공하지만 전체 코드 기반을 제어하면 미래에 필요한 경우 메소드 서명을보다 일반적인 반환 유형으로 변경할 수 있습니다.

내가 알지 못하는 다른 고려 사항이 있습니까?

도움이 되었습니까?

해결책

웹의 대부분의 예제가 ActionResult. 내가 돌아올 유일한 시간 ActionResult 클래스는 동작 메소드의 다른 경로가 다른 하위 유형을 반환 할 때입니다.

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

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

다른 팁

항상 반환 할 수있는 가장 정확한 유형을 반환하십시오. 따라서 액션이 항상보기를 표시 할 때는 viewresult를 반환해야합니다. 어떤 경우에는 viewResult에서 반환 할 때만 ActionResult (유효하지 않은 게시물) 또는 다른 경우에는 Rediptorouteresult 만 사용합니다.

Advanced ActionFilter/실행 시나리오를 사용하면 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, 등.

그렇습니다. 나는 Sanderson의 책을 가지고 있으며, 다른 컨트롤러 액션 예제를 볼 때 저를 맹렬히하는 것이었기 때문에 그 부분이 구체적으로 마음에 들었습니다. 저의 철학조차도 B4 학습 MVC조차도 기능 (값을 반환하는 메소드)을 마치 같은 유형의 변수/심판에 대해 변수/컨텍스트에서 대체 가능한 것처럼 취급되는 것처럼 취급되어야한다는 것이 었습니다. VAR을 선언하는 경우 (앱에서 모든 변수를 유형 "객체"로 방어하는 것을 피하고 싶다고 생각합니다. 더 강력하지만 설계 시간 점검 및 유형 안전을 잃게됩니다). 올바른 반환 유형에 대한 컨트롤러 장치 테스트도 용이합니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top