2011-02-09 2 views
7

이 MVC 3 면도기 응용 프로그램을 사용하여 일반적으로 내보기에 대한보기 모델을 활용합니다.MVC 컨트롤러 작업 - 중복 코드를 사용하여 POST 및 GET 처리

상당수의 내보기 모델에는 양식에서 상호 작용하고있는 특정 엔터티 이외의 많은 정보가 들어 있습니다. 그래서 내 GET 액션 핸들러는 뷰 모델을 초기화하고 각 속성에 원하는 값 등을 제공합니다.

내 POST 액션 핸들러에서 모델 상태가 유효한지 확인합니다. 그렇지 않으면 폼/뷰를 다시 표시합니다. 오류.

내 POST 액션 처리기에서 직접 내 GET 액션 핸들러에서 코드를 복사해야 뷰를 다시 렌더링 할 수 있습니다. 뷰 모델에 대한 데이터를 수집하는 코드를 복사 할 필요가 없도록 컨트롤러 동작을 구현하려면 어떻게해야합니까?

POST와 GET을 모두 처리 할 수있는 액션 처리기를 허용하려했지만 처리 할 입력 매개 변수가 있습니다. 내 POST 액션 핸들러는 뷰 모델을 입력 매개 변수로 갖지만 GET 액션 핸들러는 그렇지 않습니다.

+1

지금 작성중인 코드의 몇 가지 예를 제공 할 수 있습니까? – marcind

+1

조치를 취하기 위해 게시 작업을 리디렉션하려고 했습니까? – frennky

답변

4

이러한 상황에서 우리는 뷰 모델 용 빌더를 작성합니다.

this post 아래의 옵션 3을 살펴보십시오.

+0

+1 멋지고 깨끗한 접근 방식입니다. –

+0

원래 코드를 기반으로하는 것처럼 참조 된 코드에서 get 및 post 작업 모두에서 빌더를 사용하지는 않지만 viewmodel에 대한 빌더를 작성하는 것이 좋습니다. – JBeckton

-1

POST 액션 메서드는 모든 개별 데이터 대신 매개 변수로 뷰 모델 유형 만 사용할 수 있어야합니다. viewmodel이 좀 더 복잡하다면 뷰 모델의 modelbinder를 작성하여보다 복잡한 작업을 수행 할 수 있습니다 (작업 메서드는 여전히 VM 유형을 매개 변수로 사용합니다). ModelState이 모든 오류 메시지 (유효하지 않은 입력)를 보유하고 있기 때문에

public ActionResult SomePageGet() { 
    var model = new SomePageViewModel(); 

    // Populate ViewModel: 
    ... 

    return View("SomePageGet", model); 
} 

[HttpPost] 
public ActionResult SomePagePost(SomePageViewModel input) { 

    // Validate the model: 
    ... 

    if (!ModelState.IsValid) { 
     // Return the GET page, with error messages: 
     return SomePageGet(); 
    } 

    return View("Success"); 
} 

을 GET 페이지는 일반적으로하여 표시합니다 다음과 같이

[HttpPost] 
public ViewResult MyAction(MyViewModel model) { 
    // model should now be fully populated; check ModelState.IsValid though in case there are errors (such as the user entering "abc" for an int property) 
} 
7

게시물 핸들러는 GET 핸들러에서 ActionResult를 반환 할 수 있습니다.

0

작업중인 기본 엔터티의 확장 메서드로 공용 코드를 리펙토링하면됩니다.

그런 다음 DRY에 머무르는 동안 원하는만큼 전화하십시오.

나는 그 공통 코드의 기능이 무엇인지 정확히 알지 못하지만 대부분 리치 프리젠 테이션을위한 관련 데이터가 될 것입니다. 그 경우 내가 선호하는 솔루션은 RenderAction을 사용하여 다른 작업에서 추가 데이터를로드하도록하고 나중에 AJAX 페이지 업데이트로 리팩토링하여 DRY으로 유지하고 작업에 대한 우려를 분리 할 수있게하는 것입니다.

0

나는 이유를 이해하지 않습니다 "... 나는 ... 자신이 코드를 복사하는 것을 찾을 수 있습니다"; 컨트롤러에 멤버를 만들고 호출 할 수없는 이유는 무엇입니까? 귀하의 컨트롤러에있는 모든 것이 액션이어야합니다. 그러나 @ataddeini가 제안한 것처럼 빌더를 대신 보려고 할 수도 있습니다.