2010-04-14 8 views
11

내 MVC 앱은 (JQuery.get()을 통해) 많은 ajax 호출을하는 경향이있다. 내 컨트롤러가 아약스을 통해 호출되는 여러 가지 작은 메서드로 흩어져있는 일종의 괴롭힘입니다. 컨트롤러는 이제 다음 데이터 액세스 구성 요소는 URI 라우터의 더되고 있습니다 - MVC 패턴 조금 깨는 의 종류로 나에게 보인다. ASP MVC Ajax 컨트롤러 패턴?

난 그냥 (ActionResponse의 객체를 returing) 표준 라우팅 반응을 수행하는 I가 페이지 내 '진정한'컨트롤러가 너무 리팩토링. 따라서/home /에 대한 호출은 분명히 일반 제인 뷰를 반환하여 정식 컨트롤러 방식으로 응답하는 HomeController 클래스를 시작합니다.

는 그때 그의 이름은 내가 '아약스'와 앞에 추가하고있어 새로운 컨트롤러 클래스에 내 아약스 물건을 움직였다. 따라서 예를 들어, 내 페이지에는 기능의 세 가지 섹션이있을 수 있습니다 (장바구니 또는 사용자 계정). 나는 각각 (AjaxCartController, AjaxAccountController)에 대한 Ajax 컨트롤러를 가지고있다. 아약스 호출 항목을 자체 컨트롤러 클래스로 옮기는 것에 대해서는 전혀 다른 점이 없습니다. 단지 더 깨끗한 것을 유지하는 것입니다.. 클라이언트 측에서 분명히 JQuery와는 thusly 히이 새로운 컨트롤러를 사용합니다 :

//jquery pseudocode call to specific controller that just handles ajax calls 
$.get('AjaxAccount/Details'.... 

(1) 아약스 호출에 응답 MVC에서 더 나은 패턴이있다?

(2)가 아약스에 올 때 MVC 모델은 약간 새는 것을 나에게 보인다 - 정말 물건을 '제어'아니에요. 그것은 단지 Ajax 호출을 처리하는 가장 좋고 가장 고통스러운 방법입니다 (또는 나는 무지한가요?).

다른 말로하면, 'Controller'추상화는 Ajax (적어도 패턴 관점에서)에서는 좋지 않은 것처럼 보입니다. 내가 빠진 것이 있습니까? 너무 많은 세분화 된 요청이있는 경우

답변

4

, 난 당신이 이미 한 일을하는 경향이 WinForms에 일반적으로 나타나는 Model-View-Presenter 패턴에서). 즉,이 "컨트롤러"는 제어하지 않고 뷰 인터페이스에 연결되어 있습니다. 그러나보기와 달리 컨트롤러 발표자를 테스트 할 수 있습니다. 우리는 웹 페이지, 우리는 세밀한 방식으로 반응 할 수있는 무언가로 선회하고를 AJAXify

, 그래서 세밀한 방법 괜찮아. 화강암은 포인트이며 발명 된 전체 이유입니다. 특정 패턴은 RPC와 유사한 모델을 선택하는 대신 UI 요구 사항을 해결하지 못하기 때문에 의도적으로 특정 시나리오에 대해 REST에서 벗어납니다. 그것들은 단지 패턴 일뿐입니다. 우리의 기술 스택이 우리를 하나씩 밀어 붙일지라도 모든 상황에서 다른 것보다 나아지지 않을 것입니다. 실제로 HTTP 자체는 청크/페이지/엔티티/표현 상태 전송 문서에서 더 잘됩니다.

정신적으로이 페이지는 WinForms 응용 프로그램의 양식 인 것처럼 취급 할 수 있습니다. 이러한 방법이 "컨트롤러"에 있다는 사실은 사용되는 기술에 대한 유물이자 양보입니다.(만약 당신이 신경 쓰지 않는다면, AJAX 메소드를 IHttpHandler으로 옮기고 MVC를 우회 할 수는 있지만 왜 자동 라우팅/인스턴스화/메소드 룩업을 버리고 자신을 어렵게 만들까요? 그것은 구조적으로 '깨끗한'것이고 순수하지만 반신 반의 이익.)

는 ... 적어도, 그 도움이 나에게하지 않는 것 스위치 문을 사용하여

+0

동의하십시오 - 기본적으로 웹에는 '물건'에 대한 두 가지 액세스 권한이 있습니다. MVC 패턴은 한 가지 방법을 처리하고 다른 방식으로 우리 패턴과 일치하지 않기 때문에 이야기하고 싶지 않습니다. 하지만 아약스가 매력적인 기술이기 때문에 (적어도 현재의 앱은 아약스를 통해 거의 완전히 구동됩니다.) 멋진 MVC 패턴은 아약스 호출에 응답하기 위해 실제로 우회되고 해킹되고 있습니다. 추가 할 수도 있음). MVC 세계에서 아약스가 아직 아주 좋은 이야기는 아닌 것처럼 보인다. –

0

, 모든 호출을 서비스하는 하나의 컨트롤러의 조치 방법을 할 수 있습니다. 이 방법에서 '스위치'를 사용하여 통화 유형을 결정하고 그에 따라 서비스를 제공 할 수 있습니다. 스위치 변수에 숫자 대신 명시 적 문자열 상수를 사용할 수도 있습니다. (같은 내가 나 자신 AjaxCartPresenter에 생각 AjaxCartController을 읽을 때를 제외하고 - 당신이 ASP.NET MVC의 라우팅 마법의 작품을 만들기 위해 그것의 끝에 Controller을 넣어 수도 있지만

+0

) = 나는 나 자신에게 그것을 합리화 방법입니다. 뭐가 더 나빠질지라도 .. 너의 요점을 모르겠다. –