2010-08-11 3 views
4

내 MVC 응용 프로그램에서 ascx 부분 뷰를 몇 개 만들어서 재사용 가능한 기능을 캡슐화하고 SOR 및 SOC를 보관해야합니다. 그러나 MVC ascx 뷰를 구동하는 비즈니스 로직을 캡슐화하는 방법에 어려움이 있습니다.MVC : MVC ascx 부분 뷰에서 논리를 캡슐화하는 방법은 webforms ascx 컨트롤의 효율성과 동일합니까?

웹 폼에서 ASCX 컨트롤의 코드 숨김은 버튼 클릭 이벤트를 처리 할 수 ​​있으며 브라우저는 여전히 하나의 포스트 백이있는 동일한 페이지를 표시합니다. MVC에서 동일한 것을 어떻게 보관할 수 있습니까? ~/Address/Edit/2에 다른 MVC 동작을 호출하는 버튼이있는 ascx 부분보기가 포함되어있는 경우 ~/ShareController/CommonAction - CommonAction이 포함 된 바로 그 뷰로 돌아가는 가장 좋은 방법은 무엇입니까? ascx 파일?

아마도 MVC 웹 개발에 공통 패턴이 누락 되었습니까?

최대에게,

업데이트를 주셔서 감사합니다 : 주소 편집기 있어야

부분보기 : 여기에 내가 찾고 있어요 패턴에 대한 자세한 설명입니다. 주소를 확인하고 유효성 검증 오류를 표시하고 정보를 다시 데이터베이스에 저장할 수 있습니다.

주소 편집기는 다른 컨트롤러/동작이있는 여러 페이지에 있습니다.

전통적인 웹 폼에서 ascx 컨트롤은 URL을 변경하지 않고도 많은 포스트 백을 통해 사용자와 완벽하게 상호 작용할 수 있습니다. MVC에서 비슷한 시나리오에 대한 올바른 패턴은 무엇입니까?

업데이트 2 :

이 웹 양식의 statefullness와 아무가 확실하지. 완전히 다른 기능. 이것은 컨트롤러가 부분 뷰를 처리하기 위해 다른 하위 컨트롤러 (또는 하위 컨트롤러)를 호출하는 것입니다. 이 주석 끝에 나의 예를 보라.

나는 단지 캡슐화와 관심의 분리와 같은 수준을 달성하고 싶다. MVC 프레임 워크가 없다면, 그것은 심각한 약점입니다.

MVC에서 프레젠테이션뿐만 아니라 논리를 처리하고 간섭없이 다른 상위 페이지 내에 상주 할 수있는 "것"(또는 더 나은 대안이없는 부분 뷰)을 어떻게 가질 수 있습니까?

MVC의 부분 뷰는 주 컨트롤러를 방해하지 않고 전용 컨트롤러를 가질 수없는 프레젠테이션 일뿐입니다. 내가 잘못했기를 바란다.

또 다른 예를 들면, "stackoverflow.com/questions/{id}"를 읽고있는이 페이지를 생각해 보라. 여기에는 "주석 추가"구성 요소가 포함됩니다. 추가 주석은 유효하지 않은 주석을 방지하기 위해 서버 측 유효성 검사를 수행 할 수 있습니다. 페이지에 상주하고 필요한 컨트롤러 로직을 처리 할 수있는 엔드 투 엔드 "주석 추가"구성 요소를 어떻게 만들 수 있습니까? 내가 생각할 수있는 유일한 방법은 사용자 유효성 검사 메시지를 제공하고 포스트 백을 통해 오류를 수정하도록 요청할 수 있도록 호스트 페이지의 컨트롤러를 수정하는 것입니다. 즉, 10 개의 다른 페이지에 구성 요소를 추가하면 10 개의 다른 컨트롤러를 수정해야합니다. 그건 "죽는다"

내가 잘못 생각하니! MVC가 너무 좋아서.

결론 : 나는이 답변으로 케니의 대답을 표시

; 그러나 이것은 캡슐화, 재사용 가능성 및 DRY 주요 관점에서 볼 때 MVC 프레임 워크의 심각한 약점이라고 생각합니다.

제 의견은 웹 폼의 상태에 관계가 없습니다.

내가 설명 할 수 있도록하십시오 : 웹 양식에서

는, 당신은 100 %는 ASCX 컨트롤에서 물론 관련 CLASSLIB DLL을의 복잡한 기능을 캡슐화 할 수 있습니다. 1 명의 개발자가 개발에 수 주일을 소비 할 수 있습니다. 그의 작업이 끝나면 아무도 그것에 대해 알 필요가 없으며 단지 그것을 사용합니다. 사용자 컨트롤은 다른 "개발자 사용자"에게 ascx 구성 요소 내에서 발생하는 세부 활동을 신경 쓰지 않고도 많은 페이지에서 재사용 할 수 있습니다.

대조적으로 ascx partial이 사용자와 상호 작용해야하는 ASP.NET MVC에서는 결코 같은 결과를 얻을 수 없습니다. ascx가 상호 작용할 필요가 있으면 자신의 컨트롤러가 필요하며 컨트롤러는 ModelState를 보존해야합니다.

Jeremy Skinner는 MVCContrib에 [ModelStateToTempData]를 소개했습니다. http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/ 그러나 이것은 단지 패치 일뿐입니다.

좋은 프레임 워크는 개발자가 자신의 작업을 컨트롤, 부분, ascx 등으로 캡슐화하고 나머지 팀원에게도 데이터를 알리지 않고 "그냥 사용할 수"있어야합니다. Winform은 여러 복잡한 시나리오에서이를 완벽하게 제공합니다.

아무튼 환영합니다.

+0

특정 시나리오에서 사용되는 부분보기는 무엇입니까? 버튼 클릭의 목적은 무엇입니까? –

+0

안녕하세요 Jeff, 방금 ​​더 많은 코멘트를 추가했습니다. 감사. – DevTeach2010

답변

0

100 % 문제가 발생하지만 사용자가 필요로하는 데이터를 UserControl에 제공하지 않는다면 어떻게됩니까?

클릭하면 제출할 URL이 < % = Url.Action() %>입니다. 그런 다음 페이지를 다시 리디렉션하여 ModeledState를 리디렉션하고 다시 저장할 수 있습니다 (http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx 팁 13). 리디렉션은 리퍼러에서 수행하거나 action 및 controller 이름을 action-method로 전송하여 수행 할 수 있습니다.

그래도 작동하지 않는다면 항상 Ajax를 사용할 수 있습니까?

+0

안녕하세요 Kenny, 도움을 주셔서 감사합니다. 당신이 나에게 말한 링크는 "MVCContrib 프로젝트도이 기능을 가지고 있지만, 내가 좋아하지 않는 단일 클래스에서이 작업을 수행하고 있습니다."MVCContrib의 정확한 기능이 무엇인지 알고 있습니까? 다시 한번 감사드립니다. – DevTeach2010

+0

예, 그들은 ModelStateToTempData 필터를 사용합니다. –

0

나는 이것이 "가정 된"방법이 아니라는 것을 거의 확신하지만, 나는 일반적으로 referer URL을보고 거기로 리디렉션합니다.

+0

부분 뷰에서 몇 번의 포스트 백을 통해 유효성 검사 피드백을 표시해야하는 경우 리디렉션이 작동하지 않습니다. 리디렉션하면 ModelState가 사라집니다. – DevTeach2010

+0

WebForms의 "stateful"패러다임에 빠져있는 것처럼 보입니다. 웹 애플리케이션을 개발자 관점에서 "똑같은"Windows 애플리케이션과 같이 작동시키려는 시도 때문에 요청간에 폼 상태를 기억하는 데 크게 의존합니다. 반면에 MVC는 일련의 독립적 인 요청 인 웹 애플리케이션을 필요로합니다. 당신은 statefullness를 요구하지 않는 그런 방법으로 당신의 신청을 디자인해야한다. –

+0

Fyodor : 위의 두 번째 업데이트를 참조하십시오. – DevTeach2010

0

MVC에서 이러한 유형의 기능을 처리하는 적절한 방법은 (실제로 웹 폼이 아닌) Ajax 호출을 사용하는 것입니다.

전체 페이지 포스트 백을 만드는 것은 본 것처럼 어색합니다. 그러나 전체 페이지가 아닌 컨트롤이 포함 된 페이지 부분 만 업데이트하는 ajax 작업에 게시 작업 및 유효성 검사 오류 표시를 통합하여 원하는 모든 작업을 수행 할 수 있습니다.

0

나는 똑같은 것을 찾고 있는데, 서버에서 컨트롤러를 실행하고 리턴/출력을 출력하는 것처럼 보이는 Html.Action과 .RenderAction을 보았습니다.

MVC에서 캡슐화 및 재사용을 위해 사용될 수 있지만 아직 시도하지 않았습니다.

관련 문제