CTP 이후로 ASP.NET MVC를 다루어 왔으며 많은 일을 좋아하지만 얻지 못하는 것이 있습니다.
예를 들어, 나는 beta1을 다운로드했고 작은 개인 사이트 / 이력서 / 블로그를 함께 가지고 있습니다. ViewSinglePost 뷰의 스 니펫은 다음과 같습니다.
<%
// Display the "Next and Previous" links
if (ViewData.Model.PreviousPost != null || ViewData.Model.NextPost != null)
{
%> <div> <%
if (ViewData.Model.PreviousPost != null)
{
%> <span style="float: left;"> <%
Response.Write(Html.ActionLink("<< " + ViewData.Model.PreviousPost.Subject, "view", new { id = ViewData.Model.PreviousPost.Id }));
%> </span> <%
}
if (ViewData.Model.NextPost != null)
{
%> <span style="float: right;"> <%
Response.Write(Html.ActionLink(ViewData.Model.NextPost.Subject + " >>", "view", new { id = ViewData.Model.NextPost.Id }));
%> </span> <%
}
%>
<div style="clear: both;" />
</div> <%
}
%>
역겨운! (또한 HTML에는 임시 자리 표시 자 HTML이 있으므로 기능이 작동하면 실제 디자인을 만들 것입니다) .
내가 뭔가 잘못하고 있습니까? 나는 고전적인 ASP에서 많은 어두운 날을 보냈기 때문에이 태그 수프는 그것을 강력하게 상기시킵니다.
모든 사람이 당신이 더 깔끔한 HTML을 할 수있는 방법을 설교합니다. 뭔지 맞춰봐? 모든 사람의 1 %가 출력 된 HTML을 봅니다. 나에게, 유지하기 쉬운 코드가있는 한 Webforms가 렌더링 된 HTML에서 들여 쓰기를 엉망으로 만들지 않아도됩니다.
그래서, 다이 하드 webforms 사람, 나를 변환하기 위해 왜 멋지게 형성된 ASPX 페이지를 포기해야합니까?
편집 : “temp Html / css”줄을 굵게 표시하여 사람들이 그것에 대해 설명합니다.
답변
Web Forms와 비교할 때 MVC는 HTML 생성에 대한 하위 수준의 접근 방식 이며 페이지 출력을보다 강력하게 제어하고 아키텍처 수준이 높은 고급 수준의 접근 방식입니다. Web Forms와 MVC를 캡처하고 고전적인 Web Forms 트랩에 속하지 않는 한 많은 상황에서 비교가 Web Forms를 선호한다고 생각하는 이유를 보여 드리겠습니다.
웹 양식
Web Forms 모델에서 페이지는 브라우저의 페이지 요청과 직접 일치합니다. 따라서 사용자를 서적 목록으로 안내하는 경우 “Booklist.aspx”라는 페이지가있을 수 있습니다. 해당 페이지에서 해당 목록을 표시하는 데 필요한 모든 것을 제공해야합니다. 여기에는 데이터 가져 오기, 비즈니스 로직 적용 및 결과 표시를위한 코드가 포함됩니다. 페이지에 영향을주는 아키텍처 또는 라우팅 논리가있는 경우 페이지의 아키텍처 논리도 코딩해야합니다. 우수한 Web Forms 개발에는 일반적으로 별도의 (단위 테스트 가능) DLL로 지원 클래스 세트 개발이 포함됩니다. 이 수업은 비즈니스 로직, 데이터 액세스 및 아키텍처 / 라우팅 결정을 처리합니다.
MVC
MVC는 웹 애플리케이션 개발에 대해보다 “건축적인”관점을 취합니다. 즉, 구축 할 표준화 된 스캐 폴드를 제공합니다. 또한 기존 아키텍처 내에서 모델, 뷰 및 컨트롤러 클래스를 자동으로 생성하기위한 도구를 제공합니다. 예를 들어, Ruby on Rails (여기서는 “Rails”만)와 ASP.NET MVC에서 웹 애플리케이션 아키텍처의 전체 모델을 반영하는 디렉토리 구조로 시작해야합니다. 뷰, 모델 및 컨트롤러를 추가하려면 Rails의 “Rails 스크립트 / 생성 스캐 폴드 {modelname}”(ASP.NET MVC는 IDE에서 유사한 명령을 제공함)과 같은 명령을 사용합니다. 결과 컨트롤러 클래스에는 색인 (표시 목록), 표시, 새로 작성 및 편집 및 삭제 (적어도 Rails에서는 MVC가 유사 함)에 대한 메소드 ( “Actions”)가 있습니다. 기본적으로이 “
디렉토리와 파일의 레이아웃은 MVC에서 중요합니다. 예를 들어 ASP.NET MVC에서 “Book”개체 의 Index 메서드에는 “Return View ();”라는 한 줄만있을 것입니다. MVC의 마법을 통해 책 모델을 책을 표시하는 코드를 찾을 수있는 “/View/Books/Index.aspx”페이지로 보냅니다. 논리가 조금 더 명확하고 덜 “매직”하지만 Rails의 접근 방식은 비슷합니다. MVC 앱 의 보기 페이지는 일반적으로 웹 양식 페이지보다 간단합니다. 라우팅, 비즈니스 로직 또는 데이터 처리에 대해 걱정할 필요가 없기 때문입니다.
비교
MVC의 장점은 문제를 명확하게 구분하고보다 생산적인 HTML / CSS / AJAX / 자바 중심의 모델을 생성하는 것입니다. 이를 통해 테스트 가능성이 향상되고보다 표준화 된 디자인이 제공되며보다 “Web 2.0″유형의 웹 사이트가 열립니다.
그러나 몇 가지 중요한 단점도 있습니다.
첫째, 데모 사이트를 만들기가 쉽지만 전체 아키텍처 모델에는 상당한 학습 곡선이 있습니다. 그들이 “컨벤션 오버 컨벤션 (Convention Over Configuration)”이라고 말하면, 배우는 책의 관습이 중요하다는 것을 알기 전까지는 좋은 소리가납니다. 또한, 당신이 있기 때문에 뭐가 어떻게 돌아가는지 파악하기 위해 비트 미치게 자주 하는 명시 적으로 호출보다는 마법에 의존는. 예를 들어 “Return View ();” 위에 전화? 다른 행동에서 똑같은 전화를 찾을 수 있지만 다른 장소로갑니다. MVC 규칙 을 이해하면왜 이런 일이 일어나는지 알 것입니다. 그러나 확실히 좋은 이름 지정 또는 이해하기 쉬운 코드의 예에 해당되지는 않으며 새로운 개발자가 Web Forms보다 선택하기가 훨씬 어렵습니다. 올해 MVC와 생산성의 차이가 두드러졌습니다 (Web Forms에 유리함). BTW, Rails는 이와 관련하여 조금 더 나아졌지 만 Ruby on Rails는 동적으로 명명 된 메소드를 사용하여 약간의 사용이 필요합니다.
둘째, MVC는 사용자가 기존 CRUD 스타일 웹 사이트를 구축하고 있다고 암시합니다. 아키텍처 결정 및 특히 코드 생성기는 모두 이러한 유형의 웹 응용 프로그램을 지원하도록 구축되었습니다. CRUD 응용 프로그램을 구축 할 때 입증 된 아키텍처를 채택하거나 아키텍처 설계를 싫어하는 경우 MVC를 고려해야합니다. 그러나 CRUD 이상을 수행하거나 아키텍처와 합리적으로 경쟁력이 있다면 MVC는 기본 라우팅 모델을 실제로 마스터 할 때까지 직선 자켓처럼 느껴질 수 있습니다 (WebForms 앱에서 라우팅하는 것보다 훨씬 더 복잡합니다). 그럼에도 불구하고, 나는 항상 모델과 싸우고 예기치 않은 결과에 대해 걱정하는 것처럼 느꼈습니다.
셋째, Linq에 신경 쓰지 않는다면 (Linq-to-SQL이 사라질까 두려워하거나 Linq-to-Entities가 과도하게 생성되고 전력이 부족하다는 것을 알기 때문에) 원하지 않습니다. Linq 주위에 ASP.NET MVC 스캐 폴딩 도구가 구축되어 있기 때문에이 길을 걸을 수 있습니다. Rails의 데이터 모델은 또한 SQL에 익숙한 경우 (특히 TSQL 및 저장 프로 시저에 정통한 경우) 달성 할 수있는 것과 비교할 때 매우 어색합니다.
넷째, MVC 지지자들은 종종 MVC 뷰가 웹의 HTML / CSS / AJAX 모델에 더 가깝다고 지적합니다. 예를 들어, 내용을 바꾸고 HTML 컨트롤에 배치하는 Vew 페이지의 작은 코드 호출 인 “HTML Helpers”는 Web Forms 컨트롤보다 Javascript와 통합하기가 훨씬 쉽습니다. 그러나 ASP.NET 4.0에는 컨트롤의 이름을 지정하는 기능이 도입되어 이러한 이점을 크게 제거했습니다.
다섯째, MVC 순수 주의자들은 종종 Viewstate를 무시합니다. 어떤 경우에는 그렇게 할 수 있습니다. 그러나 Viewstate는 훌륭한 도구이자 생산성에 도움이 될 수 있습니다. 비교해 보면 MVC 앱에서 타사 웹 컨트롤을 통합하는 것보다 Viewstate를 처리하는 것이 훨씬 쉽습니다. MVC의 제어 통합이 쉬워 질 수 있지만, 내가 본 모든 현재의 노력은 이러한 제어를 뷰의 컨트롤러 클래스에 다시 연결하기 위해 (어떤 정도의 거친) 코드를 작성해야합니다 (즉 , MVC 모델 을 해결 하기 위해) ).
결론
나는 여러 가지면에서 MVC 개발을 좋아한다 (장거리에서는 Rails를 ASP.NET MVC보다 선호하지만). 또한 ASP.NET MVC가 ASP.NET Web Forms의 “반 패턴”이라는 생각의 함정에 빠지지 않는 것이 중요하다고 생각합니다. 그것들은 다르지만 완전히 외계인은 아니며 두 가지를위한 공간이 있습니다.
그러나 Web Forms 개발을 선호 합니다. 대부분의 작업 에서는 작업을 수행 하기가 더 쉽습니다 (CRUD 양식 집합 생성 제외). MVC는 또한 어느 정도 과도한 이론 으로 인해 어려움을 겪고있는 것으로 보인다 . 실제로 페이지 지향 ASP.NET을 알고 있지만 MVC를 시도하는 사람들이 SO에 대해 여기에서 제기 한 많은 질문을 살펴보십시오. 예외없이, 개발자가 농구를 뛰어 넘거나 거대한 학습 곡선을 견뎌 내야 기본 작업을 수행 할 수 없다는 사실을 알게되면 치아가 많이 나옵니다. 이것은 나의 책에서 MVC 우수 웹 양식을 만드는 것입니다 : MVC는 당신이 지불하게 실제 가격 , 또는 더 나쁜 아직 조금 더 테스트 용이성을 얻기 위해 간단하게 볼 수 멋진 당신은을 사용하고 있기 때문에최신 기술.
업데이트 : 의견 섹션에서 크게 비판을 받았습니다. 일부는 상당히 공평합니다. 따라서 나는 몇 달 동안 Rails와 ASP.NET MVC를 배우면서 다음 큰 일을 실제로 놓치지 않았는지 확인했습니다! 물론, 질문에 대한 균형 잡힌 적절한 답변을 제공하는 데 도움이됩니다. 위의 답변은 의견이 일치하지 않는 경우를 대비하여 초기 답변을 크게 재 작성 한 것입니다.
MVC를 더 자세히 살펴 보는 동안 잠시 동안 주요 mea culpa로 끝날 것이라고 생각했습니다. 결국 Web Forms 아키텍처 및 테스트 가능성에 더 많은 에너지를 소비해야한다고 생각하지만 MVC는 실제로 그 요구에 응답하지 않습니다. 따라서 초기 답변에 대한 지적 비판을 제공 한 사람들에게 진심으로 “감사합니다”.
이것을 종교적 전투 로 보았고 공감대 홍수를 끊임없이 설계 한 사람들에 대해, 나는 왜 당신이 귀찮게하는지 이해하지 못합니다 (여러 번에 서로 몇 초 안에 20 개 이상의 공표가 확실히 정상이 아닙니다). 이 답변을 읽고 점수가 다른 답변보다 훨씬 낮다는 점을 감안할 때 내 답변에 대해 정말로 “잘못된”것이 있는지 궁금한 경우, 일반적인 의미보다 동의하지 않는 소수의 사람들에 대해 더 많은 것을 말하십시오. 커뮤니티 (전체적으로 100 번 이상 공표되었습니다).
사실 많은 개발자가 MVC를 신경 쓰지 않으며 실제로 블로그가 나타내는 것처럼 MS 내에서도 소수의 견해가 아닙니다.
답변
MVC를 사용하면 출력을보다 강력하게 제어 할 수 있으며,이 컨트롤을 사용하면 제대로 디자인되지 않은 HTML, 태그 수프 등을 작성할 위험이 커집니다.
그러나 동시에 이전에는 없었던 몇 가지 새로운 옵션이 있습니다 …
- 페이지 및 페이지 내의 요소를보다 세밀하게 제어
- ViewState와 같이 출력에서 ”정크”가 적거나 요소의 ID가 너무 길다 (오해하지 말고 ViewState를 좋아한다)
- Javascript를 사용하여 클라이언트 측 프로그래밍을 수행하는 기능이 향상되었습니다 (Web 2.0 Applications 누구입니까?)
- MVC뿐만 아니라 JsonResult는 매끄 럽습니다 …
이제 WebForms로 이러한 작업을 수행 할 수는 없지만 MVC를 사용하면 더 쉽게 할 수 있습니다.
서버 컨트롤 등을 활용할 수 있기 때문에 웹 응용 프로그램을 빠르게 만들어야하는 경우에도 여전히 WebForms를 사용합니다. WebForms는 입력 태그 및 제출 버튼의 모든 세부 정보를 숨 깁니다.
부주의 한 경우 WebForms와 MVC 모두 절대 가비지가 가능합니다. 항상 그렇듯이 신중한 계획과 신중한 디자인은 MVC이든 WebForms이든 관계없이 양질의 애플리케이션이 될 것입니다.
[최신 정보]
위로가 될 경우 MVC는 Microsoft의 새로운 기술입니다. WebForms가 남아있을뿐만 아니라 계속 개발 될 것이라는 많은 게시물이 있습니다 …
… 등등…
MVC가 취항하는 노선에 관심이있는 분들을 위해 “남자들”에게 피드백을 제공 할 것을 제안합니다. 지금까지 듣고있는 것 같습니다!
답변
ASP.NET MVC에 대한 대부분의 반대 의견은 아키텍처에서 가장 “선택적인”모듈 형 비트 중 하나 인 뷰를 중심으로 보입니다. NVelocity , NHaml , Spark , XSLT 및 기타 뷰 엔진을 쉽게 교체 할 수 있습니다 (모든 릴리즈에서 더 쉬워지고 있습니다). 많은 것들이 프리젠 테이션 로직과 포맷팅을위한 간결한 구문을 가지고 있으며, 방출 된 HTML을 여전히 완벽하게 제어합니다.
그 외에도 거의 모든 비판이 기본보기에서 <% %> 태그로 표시되고 이것이 얼마나 “추악한”지에 대한 것 같습니다. 이러한 의견은 종종 WebForms 접근 방식에 익숙해 져 대부분의 기존 ASP 추악함을 코드 숨김 파일로 옮깁니다.
코드 숨김을 “잘못”하지 않아도 리피터의 OnItemDataBound와 같은 항목이 있습니다.이 항목은 “태그 수프”와는 다른 방식 으로 미학적으로보기 흉한 방법입니다. foreach 루프는 특히 루프 이외의 ASP.NET 기술에서 MVC를 사용하는 경우 해당 루프의 출력에 변수를 포함하더라도 훨씬 쉽게 읽을 수 있습니다. foreach 루프를 이해하는 데 중계기에서 해당 필드를 수정하는 방법은 OnItemDataBound (및 변경해야하는 올바른 요소인지 확인하는 쥐의 둥지)를 엉망으로 만드는 것임을 이해하는 것보다 Google-fu가 훨씬 적습니다.
ASP 태그 수프 중심의 “스파게티”의 가장 큰 문제는 HTML 사이에 데이터베이스 연결과 같은 것들을 넣는 것에 관한 것이 었습니다.
<% %>를 사용하여 그렇게 된 것은 인과 관계가 아닌 클래식 ASP의 스파게티 특성과의 상관 관계 일뿐입니다. 뷰 로직을 HTML / CSS / Javascript로 유지하고 프리젠 테이션 을 수행하는 데 필요한 최소한의 로직을 유지 하면 나머지는 구문입니다.
특정 기능을 WebForms와 비교할 때 MVC 솔루션이 실제로 훨씬 단순하지 않도록 디자이너가 생성 한 모든 C # 및 코드 숨김 C #을 .aspx 코드와 함께 포함해야합니다. .
반복 가능한 표현 논리 비트에 대한 부분 뷰의 적절한 사용과 결합하면 실제로 훌륭하고 우아 할 수 있습니다.
개인적으로, 나는 초기 학습 내용의 대부분이 테스트 중심, 제어 역전 등 거의 독점적 으로이 목적에 더 초점을 맞추기를 바랍니다. “태그 수프”에 반대합니다.
어쨌든, 이것은 아직 베타 버전 인 플랫폼입니다. 그럼에도 불구하고 대부분의 Microsoft- 베타 기술보다 더 많은 배포 및 Microsoft 이외의 개발자가 실제 물건을 구축하는 방법이 늘어나고 있습니다. 따라서 버즈는 주변의 인프라 (문서, 안내 패턴 등)보다 더 멀리있는 것처럼 보이게하는 경향이 있습니다. 이 시점에서 진정으로 사용할 수 있으면 그 효과가 증폭됩니다.
답변
<% if (Model.PreviousPost || Model.NextPost) { %>
<div class="pager">
<% if (Model.PreviousPost) { %>
<span><% Html.ActionLink("<< " + Model.PreviousPost.Subject, "view")); %></span>
<% } if (Model.NextPost) { %>
<span><% Html.ActionLink(Model.NextPost.Subject + " >>", "view")); %></span>
<% } %>
</div>
<% } %>
포함 된 CSS를 포함하지 않고이 작업을 수행하는 방법을 묻는 다른 게시물을 만들 수 있습니다.
참고 : ViewData.Model은 다음 릴리스에서 모델이됩니다.
그리고 사용자 컨트롤의 도움으로 이것은
<% Html.RenderPartial("Pager", Model.PagerData) %>
여기서 PagerData는 작업 처리기에서 익명 생성자를 통해 초기화됩니다.
편집 :이 문제에 대한 WebForm 구현의 모양이 궁금합니다.
답변
사람들이 코드에 대한 관심을 멈추는 시점이 확실하지 않습니다.
HTML은 작업의 가장 공개적인 표시이며, 메모장, 메모장 ++ 및 기타 일반 텍스트 편집기를 사용하여 많은 웹 사이트를 구축하는 개발자가 많이 있습니다.
MVC는 웹 양식에서 제어권을 다시 가져오고 상태 비 저장 환경에서 작업하며 일반적으로이 패턴을 구현할 때 발생하는 추가 작업없이 Model View Controller 디자인 패턴을 구현하는 것입니다.
제어, 깔끔한 코드 및 MVC 디자인 패턴을 사용하려는 경우 이는 마크 업 작업이 마음에 들지 않으면 마크 업의 기형에 신경 쓰지 말고 ASP.Net Web Forms를 사용하십시오.
어느 쪽이든 마음에 들지 않으면 마크 업에서 거의 많은 작업을 수행하게 될 것입니다.
편집
나는 또한 Web Forms와 MVC가 자신의 자리를 가지고 있다고 진술해야하며, 나는 하나가 다른 것보다 낫다는 것을 말하지 않았고 각 MVC는 마크 업에 대한 제어력을 회복하는 힘을 가지고 있다고 주장했다.
답변
네가 빠진 것 같아 먼저 Response가 필요 없으며, <%= %>
태그를 사용할 수 있습니다 . 둘째, 일반적인 작업을 수행하기 위해 자체 HtmlHelper 확장을 작성할 수 있습니다. 셋째, 약간의 서식 지정이 많은 도움이됩니다. 넷째,이 모든 것이 여러 다른 뷰간에 공유되도록 사용자 정의 컨트롤에 붙어있을 수 있으므로 기본 뷰의 전체 마크 업이 더 깨끗합니다.
마크 업이 원하는만큼 깔끔하지는 않지만 임시 변수를 사용하면 상당히 정리할 수 있습니다.
이제는 그렇게 나쁘지 않으며 SO 용으로 포맷하지 않아도 더 좋습니다.
<%
var PreviousPost = ViewData.Model.PreviousPost;
var NextPost = ViewData.Model.NextPost;
// Display the "Next and Previous" links
if (PreviousPost != null || NextPost != null)
{
%>
<div>
<%= PreviousPost == null
? string.Empty
: Html.ActionLinkSpan("<< " + PreviousPost.Subject,
"view",
new { id = PreviousPost.Id },
new { style = "float: left;" } ) %>
<%= NextPost == null
? string.Empty
: Html.ActionLinkSpan( NextPost.Subject + " >>",
"view",
new { id = NextPost.Id },
new { style = "float: right;" } ) %>
<div style="clear: both;" />
</div>
<% } %>
답변
MVC의 가장 큰 장점은 오랫동안 사용되어 온 개념적 프레임 워크이며 가로 및 세로로 확장되는 웹 응용 프로그램과 워크 스테이션 응용 프로그램을 모두 생산할 수있는 생산적이고 강력한 방법으로 입증되었습니다. 알토와 스몰 토크로 바로 돌아갑니다. 마이크로 소프트는 파티에 늦었다. ASP.NET MVC에서 우리가 지금 가지고있는 것은 정말 원시적입니다. 왜냐하면 따라야 할 일이 너무 많기 때문입니다. 그러나 젠장, 그들은 새 릴리스를 빠르고 격렬하게 쏟아 부었습니다.
Ruby on Rails의 가장 큰 장점은 무엇입니까? Rails는 MVC입니다. 입소문으로 프로그래머가 생산성을 높일 수있는 방법이 되었기 때문에 개발자들은 전환을 해왔습니다.
대단한 일입니다. MVC와 jQuery의 암시 적 보증은 플랫폼 중립적이라는 것이 중요하다는 점을 Microsoft가 받아들이는 요령입니다. 그리고 중립적 인 점은 Web Forms와 달리 Microsoft는 개념적으로 귀하를 잠글 수 없다는 것입니다. 코드 자체가 아닌 이식 가능한 MVC 개념이기 때문에 모든 C # 코드를 가져 와서 다른 언어 (예 : PHP 또는 java-이름 지정)로 완전히 다시 구현할 수 있습니다. 또한 코드를 거의 변경하지 않고 디자인을 변경하지 않고도 디자인을 가져 와서 워크 스테이션 앱으로 구현할 수 있다는 것이 얼마나 큰지 생각해보십시오. Web Forms를 사용해보십시오.
Microsoft는 Web Forms가 다음 VB6이되지 않기로 결정했습니다.