'asp.net mvc 2'에 해당되는 글 2건

  1. 2009.10.07 Client-Side Validation in ASP.NET MVC 2 Preview 2
  2. 2009.07.31 [ScottGu] ASP.NET MVC 2 Preview 1 릴리즈!

안녕하세요? 웹지니입니다.
지난 포스트에서 말씀드렸듯이 10월 2일을 기점으로 ASP.NET MVC 2.0의 Preview 2 버전이 릴리즈 되었습니다. 이번 Preview 2 버전에서는 약간의 새로운 기능들이 추가되었는데요. 이번 포스트에서는 클라이언트 측 유효성 검사 기능에 대해 알아보도록 하겠습니다.

예제 다운로드:  MvcApplication1.zip (302.64 kb)

Valdiation with DataAnnotations API

ASP.NET MVC 2 Preview 1에서는 .NET 3.5 SP1에서 새롭게 선보인 DataAnnotations API를 이용한 유효성 검사 기능이 추가되어 있습니다. 예전에 올렸던 ASP.NET MVC 2 Preview 1 릴리즈에 대한 번역 포스트에서 이미 한 번 소개해 드렸었지요. 이 방식의 문제점은 데이터 유효성 검사를 위해 매번 폼을 POST 해야 한다는 점이었습니다. 즉 유효성 검사가 무조건 서버 측 코드에 의해 실행되기 때문에 폼이 Submit 되기 전에는 입력 요소에 대한 유효성 검사를 할 수 없다는 뜻입니다. 사실 말이야 바른 말이지 요새 누가 이런 식으로 구현하겠어요?

Client-Side Valdiation in ASP.NET MVC 2 Preview 2

해서 ASP.NET MVC 2 Preview 2에서는 Client-Side Validation API를 제공하여 이와 같은 불편을 해소하고 있습니다. 거두절미하고 예제를 통해 한 번 살펴볼까요? 우선 아래와 같이 모델 객체와 모델 객체에 대한 메타데이터 클래스가 존재한다고 가정해 보겠습니다.

코드 1: Profile 클래스와 ProfileMetadata 클래스

  1: namespace MvcApplication1.Models
  2: {
  3: 	[MetadataType(typeof(ProfileMetadata))]
  4: 	public class Profile
  5: 	{
  6: 		public string Name { get; set; }
  7: 		public string Email { get; set; }
  8: 	}
  9: 
 10: 	public class ProfileMetadata
 11: 	{
 12: 		[Required(ErrorMessage="이름을 입력해 주세요.")]
 13: 		public object Name;
 14: 
 15: 		[Required(ErrorMessage="국가를 입력해 주세요.")]
 16: 		public object Email;
 17: 	}
 18: }
 19: 

그리고 이 객체를 생성하는 HomeController 클래스의 Create 액션 메서드는 다음과 같이 구현되어 있습니다.

코드 2: HomeController.Create 액션 메서드

  1: [HandleError]
  2: public class HomeController : Controller
  3: {
  4: 	public ActionResult Create()
  5: 	{
  6: 		return View();
  7: 	}
  8: 
  9: 	[HttpPost]
 10: 	public ActionResult Create(FormCollection forms)
 11: 	{
 12: 		Profile profile = new Profile();
 13: 		this.TryUpdateModel<Profile>(profile);
 14: 		return View();
 15: 	}
 16: }

마지막으로 /Home/Create 뷰 페이지는 다음과 같이 구현되어 있습니다.

코드 3: /Home/Create 뷰 페이지의 소스 코드

  1: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
  2: 
  3:     <h2>Create</h2>
  4: 
  5:     <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>
  6: 
  7:     <% using (Html.BeginForm()) {%>
  8: 
  9:         <fieldset>
 10:             <legend>Fields</legend>
 11:             <p>
 12:                 <label for="Name">Name:</label>
 13:                 <%= Html.EditorFor(p => p.Name) %>
 14:                 <%= Html.ValidationMessage("Name", "*") %>
 15:             </p>
 16:             <p>
 17:                 <label for="Email">Email:</label>
 18:                 <%= Html.EditorFor(p => p.Email)%>
 19:                 <%= Html.ValidationMessage("Email", "*") %>
 20:             </p>
 21:             <p>
 22:                 <input type="submit" value="Create" />
 23:             </p>
 24:         </fieldset>
 25: 
 26:     <% } %>
 27: 
 28:     <div>
 29:         <%=Html.ActionLink("Back to List", "Index") %>
 30:     </div>
 31: 
 32: </asp:Content>

예제 코드에서 보듯이 13번 라인과 19번 라인은 기본적으로 생성되는 Html.TextBox 메서드 대신 Html.EditorFor 메서드를 사용하도록 수정한 상태입니다. 이 상태에서 예제 애플리케이션을 실행하고 /Home/Create 뷰를 실행하면 아래와 같은 그림이 나타나게 됩니다.

그림 1: /Home/Create 뷰에서 Submit 버튼을 클릭하여 서버 측 유효성 검사가 실행된 모습
img1

위의 그림 1의 모습은 /Home/Create 뷰에서 Create 버튼을 클릭하여 서버 측 유효성 검사가 실행된 모습입니다. Preview 1에 추가된 DataAnnotations API를 이용한 유효성 검사가 잘 동작하고 있지만 앞서 설명드렸듯이 이 페이지는 이미 서버 측으로 페이지가 Submit 된 이후의 모습입니다. 그러면 이 /Home/Create 뷰를 클라이언트 측 유효성 검사가 동작하도록 수정해 보겠습니다.

코드 3: 수정된 /Home/Create 뷰 페이지의 소스 코드

  1: <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
  2: 
  3:     <script src="../../Scripts/jquery-1.3.2.js" type="text/javascript"></script>
  4:     <script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>    
  5:     <script src="../../Scripts/MicrosoftMvcJQueryValidation.js" type="text/javascript"></script>
  6: 
  7:     <h2>Create</h2>
  8:     <% Html.EnableClientValidation(); %>
  9:     <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>
 10: 
 11:     <% using (Html.BeginForm()) {%>
 12: 
 13:         <fieldset>
 14:             <legend>Fields</legend>
 15:             <p>
 16:                 <label for="Name">Name:</label>
 17:                 <%= Html.EditorFor(p => p.Name) %>
 18:                 <%= Html.ValidationMessage("Name", "*") %>
 19:             </p>
 20:             <p>
 21:                 <label for="Email">Email:</label>
 22:                 <%= Html.EditorFor(p => p.Email)%>
 23:                 <%= Html.ValidationMessage("Email", "*") %>
 24:             </p>
 25:             <p>
 26:                 <input type="submit" value="Create" />
 27:             </p>
 28:         </fieldset>
 29: 
 30:     <% } %>
 31: 
 32:     <div>
 33:         <%=Html.ActionLink("Back to List", "Index") %>
 34:     </div>
 35: 
 36: </asp:Content>

예제 코드에서 눈 여겨 볼 부분은 3번 라인부터 5번 라인까지 스크립트를 페이지에 추가하는 코드와 8번 라인의 Html.EnableClientValidation() 메서드 호출입니다. 이 메서드는 페이지에 클라이언트 측 유효성 검사를 활성화하는 역할을 담당하며 이는 앞서 설명한 세 개의 스크립트 파일이 페이지에 추가되어 있어야 가능하게 됩니다. 그 이외의 코드는 전혀 변한 것이 없지만 페이지를 실행해 보면 아래 그림과 같이 그림 1과는 다소 다른 모습을 볼 수 있습니다.

그림 2: 클라이언트 측 유효성 검사가 동작한 모습
img2

그림 2에서 보듯이 유효성 검사 메시지가 Html.ValidationMessage 메서드를 호출한 위치에 나타나지만 ValidationSummary 메서드를 호출한 영역에는 아무것도 나타나지 않습니다. 또한 텍스트 상자에 값을 입력하면 유효성 오류 메시지는 곧바로 사라지도록 구현이 되어 있습니다. 제법 잘 만들어 진 것 같지요?

이렇게 함으로써 우리가 얻을 수 있는 이점은 모델 객체에 대한 메타데이터 클래스만 구현함으로써 모델 객체에 대한 유효성 검사 코드를 전혀 작성할 필요가 없다는 점. 또한 클라이언트 측 유효성 검사 기능을 이용함으로써  메타데이터 클래스 만으로 서버 측과 클라이언트 측 유효성 검사를 동시에 처리할 수 있다는 점 등이 장점으로 작용할 수 있겠습니다. 시간이 지날수록 점점 더 편리하면서도 강력한 기능을 제공하는 ASP.NET MVC 2의 정식 버전이 벌써부터 기다려지네요. =)

Posted by 웹지니 트랙백 0 : 댓글 0

안녕하세요? 웹지니입니다.

며칠 전부터 ASP.NET MVC 2의 Preview 1 버전을 살펴보고 있었지만 그노무 NDA때문에 입을 열지 못했는데 드뎌 Scott Guthrie 횽아가 ASP.NET MVC 2 Preview 1 릴리즈에 대한 글을 올렸네요. 바로 번역질 들어갑니다!

ASP.NET MVC V2 Preview 1 Released!

ASP.NET MVC 팀이 얼마 전 ASP.NET MVC 버전 2의 Preview 1 버전을 릴리즈했습니다. 여기에서 다운로드하실 수 있어요.

이번 Preview 버전은 .NET 3.5 SP1과 Visual Studio 2008에서 동작하며 기존의 ASP.NET MVC 1.0이 설치된 시스템에 함께 설치할 수 있습니다 (즉, 두 버전이 서로 충돌하지 않으며 MVC 버전 2를 설치해도 기존의 MVC 버전 1 애플리케이션은 아무런 영향을 받지 않습니다). ASP.NET MVC 1.0과 ASP.NET MVC 2.0을 하나의 시스템에 모두 설치하면 Visual Studio 2008의 "새 프로젝트" 대화 상자에 아래와 같이 두 개의 ASP.NET MVC 프로젝트 템플릿이 나타나게 됩니다.

img1

ASP.NET MVC 2 Preview 1의 릴리즈 노트에는 ASP.NET MVC V2의 새롭고 강력한 기능들을 사용하기 위해 기존의 ASP.NET MVC 1.0 프로젝트를 업그레이드하려는 개발자들을 위해 업그레이드 절차를 상세히 소개하고 있습니다.

새로운 기능들

ASP.NET MVC V2는 여러 가지 새로운 기능들을 제공합니다 (이들 중 일부는 이미 ASP.NET MVC 로드맵 페이지에서 언급되고 있습니다). 이번에 릴리즈 된 Preview 1 버전은 이런 새로운 기능들의 일부를 구현하고 있습니다. 다른 많은 기능들은 이후의 Preview 버전에서 차차 제공될 예정입니다. Preview 1 버전은 아직은 무르익지 않은 버전이며 ASP.NET 팀은 여러분의 피드백을 받고자 이번 Preview 버전을 공개하게 되었습니다.

그러면 이제 Preview 1 버전의 여러 기능들을 간략하게 살펴볼까요?

영역(Area)의 지원

ASP.NET MVC 2는 MVC 애플리케이션을 분리하고 그룹화할 수 있는 영역(Area)라고 불리는 새로운 기능을 제공합니다.

영역들은 컨트롤러나 뷰를 그룹화하여 대용량 애플리케이션들을 구성하는 구성 요소들을 관련된 것들만 모아 그룹화할 수 있는 기능을 제공합니다. 각각의 영역은 별도의 ASP.NET MVC 프로젝트로 구현하여 주 애플리케이션이 참조하도록 구성할 수 있습니다. 이렇게 하면 대용량 애플리케이션을 구현할 때 복잡도를 줄이고 여러 팀이 동일한 애플리케이션을 함께 구현할 수 있습니다.

아래의 스크린샷은 세 개의 프로젝트로 구성된 하나의 솔루션을 보여주고 있습니다. 그 중 "CompanySite"라는 이름의 프로젝트는 사이트의 핵심 콘텐츠와 레이아웃, 컨트롤러와 뷰 등을 가지고 있습니다. 그리고 "Blogs"와 "Forums"라는 두 개의 "영역" 프로젝트가 존재하네요. 이 두 프로젝트는 각각 웹사이트의 /Blogs와 /Forums 부분에 필요한 기능들을 구성하기 위한 라우팅 규칙과 컨트롤러, 뷰 등을 구현하는 프로젝트입니다.

img2

Preview 1 버전은 영역 개념의 초기 구현을 포함하고 있습니다. 이 기능에는 아직 아무런 보조 도구들이 제공되지 않습니다(지금 당장은 영역 프로젝트를 수동으로 추가하고 구성해야 합니다). 이후의 Preview 버전에서는 영역 프로젝트 구성을 위한 도구들이 제공될 예정이며 지속적으로 개선되고 확장될 것입니다.

DataAnnotation 유효성 검사 지원

ASP.NET MVC 2는 .NET 3.5 SP1에서 제공되며 ASP.NET Dynamic Data와 .NET RIA Service에서 활용되되고 있는  DataAnnotation 유효성 검사 기능을 내장하고 있습니다. DataAnnotation을 이용하면 모델과 뷰 모델 클래스에 유효성 검사 규칙을 손쉽게 적용할 수 있으며 UI 핼퍼를 이용하여 유효성 검사를 자동화할 수 있습니다.

이 기능이 동작하는 것을 확인하기위해 아래와 같이 "Customer"라는 이름의 뷰 모델 클래스를 생성해 보겠습니다(아래의 코드는 C#의 자동 속성 기능을 이용하여 구현하였습니다).

img3

그리고 System.ComponentModel.DataAnnotations 네임스페이스에 구현된 DataAnnotation 특성들을 이용하여 각 속성에 적당한 유효성 검사 규칙을 지정합니다. 아래의 코드는 4개의 내장된 유효성 검사 규칙인 [Required], [StringLength], [Range], [RegularExpression] 특성들을 사용한 코드입니다. 이 네임스페이스에는 여러분이 원하는 유효성 검사 규칙을 구현하기 위한 기반 클래스(ValidationAttribute)도 포함되어 있습니다.

img4

이제 CustomersController 클래스를 생성하고 두 개의 Create 메서드를 구현해봅시다. 첫 번째 Create 메서드는 "/Customers/Create" URL에 대한 HTTP GET 방식의 요청을 처리하며 빈 Customer 객체를 이용하여 뷰를 렌더링합니다. 두 번째 Create 액션 메서드는 같은 URL에 대한 HTTP POST 방식의 요청을 처리합니다 (그렇지만 Customer 객체를 매개 변수로 사용합니다).  두 번째 Create 액션 메서드는 사용자의 입력을 서버로 전송할 때 모델 바인딩 오류가 발생했는지를 검사하며 만일 오류가 발생했다면 이미 입력된 데이터와 함께 뷰 템플릿을 다시 렌더링합니다. 만일 오류가 없다면 사용자에게 성공했음을 알리는 "Success" 뷰를 렌더링합니다.

img5

마지막으로 두 개의 Create 액션 메서드를 마우스 오른쪽 버튼으로 클릭하고 "Add View" 메뉴를 선택한 후 "Scaffold" 항목을 "Create"로 선택하면 Customer 객체를 기준으로 뷰 템플릿을 자동으로 생성해 줍니다. 이렇게 생성된 뷰 템플릿은 아래와 같은 HTML 코드로 만들어집니다.

img6

이제 /Customers/Create URL을 요청하면 브라우저는 아래와 같이 빈 폼을 보여줍니다.

img7

우리가 잘못된 값을 입력하고 폼을 서버로 전송하면 ASP.NET MVC 2의 모델 바인더는 Customer 클래스에 DataAnnotations 특성이 지정된 것을 감지하고 자동적으로 입력된 값에 대한 유효성 검사를 수행합니다. 만일 유효성 오류가 발견되면 액션 메서드는 폼을 아래와 같이 적절한 오류 메시지와 함께 폼을 다시 렌더링합니다. 이 때 Html.Validation 핼퍼 메서드에 의해 DataAnnotation 특성에 지정한 오류 메시지가 페이지에 함께 출력되는 것을 볼 수 있습니다. 더욱이 이와 같은 동작을 구현하기 위해서 더 많은 코드를 작성할 필요도 없습니다.

img8

위 그림의 폼은 사용자가 잘못된 값을 입력하고 폼을 서버로 전송하려고 할 때마다 오류 메시지를 보여주게 됩니다.

다음 버전의 ASP.NET MVC 2 Preview 버전에서는 jQuery 유효성 검사 플러그인을 기본 프로젝트 템플릿에 포함하여 제공할 예정이며 DataAnnotation 규칙을 이용한 자동화된 클라이언트 측 자바스크립트 유효성 검사를 지원하게 될 것입니다. 이렇게 하면 개발자는 한 번의 코드를 작성함으로써 모델이나 뷰 모델 객체에 손쉽게 유효성 검사 기능을 추가할 수 있으며 애플리케이션에서 이런 객체들이 사용되는 곳이라면 어디든 클라이언트 및 서버 측 유효성 검사 기능을 갖출 수 있게 됩니다.

만일 모델이나 뷰 모델 객체에 직접 데이터 힌트를 주고싶지 않다면 모델 클래스와 함께 별도의 클래스를 구현하여 DataAnnotation 규칙을 분리하여 캡슐화할 수 있습니다. 이런 기능은 Visual Studio가 코드를 생성하고 클래스의 속성을 직접 수정하는 경우나 자동으로 생성된 코드에 특성을 쉽게 적용할 수 없는 경우(LINQ to SQL이나 LINQ to Entities 디자이너에 의해 만들어진 클래스들)에 유용하게 사용할 수 있습니다.

게다가 DataAnnotation 지원 기능이 내장되어있는 것 외에도 ASP.NET MVC V2의 DefaultModelBinder 클래스에는 새로운 virtual 메서드가 추가되어 우리가 원하는 어떤 종류의 유효성 검사 프레임워크(예를 들면 Castle Validator, EntLib Validation 등)와도 손쉽게 연동될 수 있습니다. ASP.NET MVC의 유효성 검사 UI 핼퍼 메서드들은 모든 종류의 유효성 검사 프레임워크를 지원하도록 디자인 되었습니다(또한 유효성 검사 프레임워크들은 DataAnnotation을 직접 사용하지 않습니다).

형식화된 UI 핼퍼

ASP.NET MVC V2는 형식화된(Strongly-Typed) 새로운 HTML UI 핼퍼 메서드들을 제공하며 람다 식을 이용하여 뷰 템플릿의 뷰 모델을 참조할 수 있게 되었습니다. 이런 기능을 통해 뷰를 컴파일 시점에 검사할 수 있게 되었으며(따라서 런타임 시점에 발생할 수 있는 버그를 줄일 수 있습니다) 뷰 템플릿에서 보다 향상된 인텔리센스를 지원할 수 있게 되었습니다.

향상된 인텔리센스가 동작하는 모습은 아래 그림과 같습니다. 그림을 보면 새롭게 제공되는 Html.EditorFor() 핼퍼 메서드를 호출할 때 Customer 모델 객체의 속성들이 나열되는 것을 볼 수 있습니다.

img9

Preview 1에는 새로운 Html.EditorFor(), Html.LabelFor(), Html.DisplayFor() 등의 핼퍼 메서드가 제공됩니다. 새롭게 버전 업된 MVC Futures의 어셈블리들은 Html.TextBoxFor(), Html.TextAreaFor(0, Html.DropDownListFor(), Html.HiddenFon(), Html.ValidationMessageFor() 등의 메서드들도 함께 제공됩니다 (나중에 이 메서드들은 ASP.NET MVC 2 어셈블리로 통합될 예정입니다).

아래의 그림은 Create 뷰 템플릿을 수정한 코드를 보여줍니다. 아래의 코드에서는 Customer 객체를 참조하는 문자열 표현식을 사용하는 대신 형식화 된 람다 식을 UI 핼퍼 메서드들과 함께 사용합니다. 따라서 컴파일 시점에 완벽한 인텔리센스의 지원을 받을 수 있게 되었습니다.

img10

UI 핼퍼 템플릿 지원

Html.EditorFor() 메서드와 Html.DisplayFor() 메서드는 표준 데이터 타입은 물론 여러 개의 속성을 가진 복합 객체(Complex Objects)들도 렌더링할 수 있습니다. 앞서 설명했듯이 [DisplayName]이나 [ScaffoldColumn]과 같은 특성을 뷰 모델 객체에 적용하여 얼마든지 마음대로 렌더링이 가능합니다.

종종 개발자들은 UI 핼퍼들이 만들어 주는 출력 결과도 재정의하고 싶어 합니다. Html.EditorFor() 메서드와 Html.DisplayFor() 메서드는 이와 같은 개발자들의 욕구를 충족시키기 위해 템플릿 매커니즘을 이용하여 개발자들이 외부의 테플릿을 이용하여 출력되는 결과를 재정의할 수 있도록 구현되었습니다. 이 기법은 데이터 타입 별 혹은 클래스 별로 사용될 때 더욱 유용합니다.

Preview 1을 사용하면 "EditorTemplates"와 "DisplayTemplates" 폴더를 \Views\[ControllerName]\ 디렉터리에 추가하거나(특정 컨트롤러가 사용하는 뷰들을 재정의할 경우) \Views\Shared\ 폴더에 추가(애플리케이션의 모든 뷰와 컨트롤러를 재정의하는 경우)할 수 있습니다.

그리고 부분적인 템플릿 파일들을 이런 폴더에 추가하여 출력 결과가 개별적인 데이터 타입이나 클래스를 토대로 수행될 수 있도록 할 수 있습니다. 예를 들어 아래의 그림에서 저는 EditorTemplates 폴더를 \Views\Shared\ 폴더에 추가했으며 이 폴더에는 세 개의 템플릿 파일이 존재합니다.

img11

이 그림에서 "Customer.ascx" 템플릿은 Html.EditorFor() 메서드에 전달되는 Customer 객체를 렌더링한 결과를 재정의하고 싶을 때 사용합니다(예를 들면 Customer 객체의 속성들이 렌더링 되는 순서나 레이아웃을 재정의할 수 있습니다). "DateTime.ascx" 템플릿은 Html.EditFor() 메서드에 전달된 DateTime 형식의 속성을 렌더링하는 방법을 재정의하고 싶을 경우 사용합니다(예를 들어 일반 텍스트 상자 대신 자바스크립트로 구현된 Date Picker를 사용할 수도 있습니다). 또한 "Object.ascx" 템플릿을 추가하여 모든 객체를 내 마음대로 렌더링할 수도 있습니다.

타입 별로 렌더링을 재정의할 수 있는 것은 물론 "명명된 템플릿"을 폴더에 추가할 수도 있습니다. 일반적으로 "CountryDropDown" 템플릿은 문자열 데이터 타입을 처리할 것입니다. 그러나 표준 텍스트 상자를 사용하는 대신 국가 값들을 가진 <select> 드롭다운 리스트를 사용하여 선택하도록 할 수 있습니다. 아래의 그림은 CountryDropDown.ascx 편집용 템플릿을 구현한 코드입니다.

img12

이 템플릿을 사용하려면 Html.EditFor() 메서드를 호출할 때 인자로 이름을 전달하면 됩니다. 예를 들어 아래의 코드는 Country 속성을 위한 람다 식을 지정하면서 렌더링에 사용할 편집용 템플릿의 이름도 함께 지정합니다.

img13

또는 뷰 모델 객체에 UIHint 특성을 지정할 수도 있습니다. 이렇게 하면 기본 편집기를나 표시기 템플릿을 한 곳에서 지정할 수 있으며 애플리케이션 내의 모든 뷰에서 활용할 수 있습니다 (즉, Html.EditFor() 메서드를 호출할 때 일일이 템플릿의 이름을 지정할 필요가 없습니다).

아래의 코드는 Customer.Country 속성에 UIHint 특성을 지정하여 기본적으로 이 속성 값을 렌더링할 때 CountryDropDown 템플릿을 사용하도록 하는 코드입니다.

img14

이 특성을 일단 뷰 모델 객체에 한 번 지정하면 Html.EditFor() 메서드를 호출할 때 템플릿의 이름을 명시적으로 지정할 필요가 없습니다. 이제 /Customers/Create URL을 새로 고치면 Country 속성이 아래 그림과 같이 표준 텍스트 상자 대신 드롭다운 목록으로 보여질 것입니다.

img15

그 외의 멋진 기능들

ASP.NET MVC 2 Preview 1 버전에는 작지만 아주 멋진 기능들이 다수 포함되어 있습니다. 그 중에 제가 좋아하는 것들을 살펴볼까요?

[HttpPost] 특성

ASP.NET MVC 프로젝트에서는 두 개의 액션 메서드로 하나의 URL을 처리하는 경우가 비일비재합니다. 즉, 하나는 GET 방식의 요청을 처리하고 다른 하나는 POST 방식의 요청을 처리하는 것이지요.

ASP.NET MVC 1에서는 아래와 같이 [AcceptVerbs(HttpVerbs.Post)] 특성을 지정하여 POST 방식의 요청을 처리할 액션 메서드를 지정했었습니다.

img16

ASP.NET MVC 2에서도 이 방법을 사용할 수는 있지만 [HttpPost] 특성을 이용하면 더욱 간편하게 동일한 결과를 얻을 수 있습니다.

img17

매개 변수의 기본 값

선택적인 매개 변수를 처리하는 것은 웹에서는 매우 일반적인 시나리오입니다. ASP.NET MVC 1에서는 선택적인 매개 변수들을 처리하기 위해서 라우팅 규칙을 재정의하여 기본 값을 지정하거나 혹은 액션 메서드의 매개 변수에 nullable 타입을 사용하여 액션 메서드가 null 값을 받아들일 수 있도록 했었습니다.

ASP.NET MVC 2 Previewe 1에서는 이제 액션 메서드의 매개 변수에 System.ComponentModel 네임스페이스에 구현된 DefaultValueAttribute 특성을 지정하여 기본 값을 지정할 수 있게 되었습니다. 이 특성을 이용하면 ASP.NET MVC가 현재 요청에 전달되지 않은 값이 존재하는 경우 매개 변수에 기본 값을 전달할 수 있습니다. 예를 들어 아래의 코드는 /Products/Browse/Beverages와 /Products/Browse/Beverages?page=2 URL에 대한 요청을 처리할 수 있는 액션 메서드를 보여줍니다. page 매개 변수는 쿼리 문자열에 값이 존재하지 않는 경우 1이라는 기본 값을 갖게 됩니다.

img18

현재는 VB도 VB 언어 내에서 매개 변수의 기본 값을 지정할 수 있습니다(앞서처럼 Defaultalue 특성을 명시적으로 지정할 필요가 없습니다). C#도 Visual Studio 2010 부터는 선택적 매개 변수를 지원할 예정이어서 위의 코드가 아래와 같이 간소화될 수 있습니다.

img19

이렇게 하면 기본 값 혹은 선택적 매개 변수가 필요한 경우를 보다 쉽고 깔끔하게 구현할 수 있습니다.

바이너리 데이터의 바인딩

ASP.NET MVC 2 Preview 1에는 Base64 형식으로 인코딩된 문자열 값을 byte[] 타입이나 System.Data.Linq.Binary 타입에 바인딩할 수 있는 기능이 제공됩니다. 그런 이유로 Html.Hidden() 메서드가 이런 데이터 타입을 받아들일 수 있도록 추가로 두 가지 형식이 더 재정의 되었습니다.  이 기법을 이용하면 데이터베이스의 timestamp 값 등을 사용하는 애플리케이션을 더욱 견고하게 제어할 수 있습니다.

요약

여기를 클릭하면 이번 포스트에서 사용한 ASP.NET MVC 2 프로젝트를 담은 .ZIP 파일을 다운로드 할 수 있습니다.

ASP.NET MVC 2는 이제 첫 번째 Preview 버전이 발표되었을 뿐입니다. 이후에는 더 많은 Preview 버전들이 공개될 것이며 ASP.NET 팀은 ASP.NET MVC 2를 더욱 발전시킬 수 있는 다양한 피드백을 전달받기를 원합니다.

이렇게 정기적으로 Preview 버전을 공개하는 목적은 이처럼 피드백을 받는 과정을 공개하고 누구든지 원한다면 함께 작업할 수 있는 환경을 구성하기 위한 것입니다. 피드백, 제안 혹은 문제점들을 www.asp.netASP.NET MVC 포럼에 올려주세요. 또한 Phil Haack의 MVC 2 포스트에서도 많은 것을 배울 수 있으며 Preview 1의 릴리즈에 대한 Phil과 Scott Hanselman의 Channel 9 동영상도 있습니다.

도움이 되셨기를 바랍니다.

Scott

P.S: 저는 요즘 트위터를 사용하는 재미에 푹 빠졌어요. 저와 함께 트위터를 즐기시려면 http://twitter.com/scottgu를 방문해 주세요. (제 트위터 별칭은 @scottgu랍니다)

Posted by 웹지니 트랙백 0 : 댓글 0