2009-07-16 10 views
19

ASP.NET MVC에서 유효성 검사를 구현하는 방법에 대한 대부분의 정보는 모델 (모델과 컨트롤러 사이의 서비스 계층을 작성하거나 유효성 검사 속성을 사용하여 모델의 속성을 꾸미기) .ASP.NET MVC의 ViewModels에 대한 유효성 검사

내 응용 프로그램에서는 컨트롤러와 뷰 간의 모든 통신에 ViewModels를 사용합니다.

'EmailAddress'라는 속성을 가진 'LoginViewModel'이라는 로그인 페이지 용 ViewModel이 있습니다.

사용자가 전자 메일 주소를 입력하고 제출을 클릭하면이 ViewModel이 채워지고 컨트롤러로 전자 메일 주소의 유효성이 검사됩니다.

올바른 이메일 주소 여야하며 사용자는 시스템에 등록 된 도메인의 사용자 여야합니다.

여기에 유효성 검사를 추가하는 편리한 방법은 무엇입니까? ViewModel 자체에 검증을 넣어야합니까? 아니면 컨트롤러에 있어야합니까?

답변

5

"인증을 ViewModel 자체에 넣어야합니까? 또는 컨트롤러에 있어야합니다. "로버트에 동의하지만 추가적인 자동화를 위해 플러그를 추가 할 것입니다. xVal과 같은 도구를 살펴보면 일상적인 유효성 검사 (예 : 필수 필드, 범위, 정규 표현식과 일치하는 문자열)은 데이터 클래스의 필드를 꾸미면 자동으로 수행 할 수 있습니다. 사실 xVal은 일상적인 유효성 검사를위한 JavaScript를 자동으로 작성하여 클라이언트 측에서 수행됩니다. 이 사용자는 우리의 데이터베이스에 등록 된 도메인의 멤버입니까?) 모델 계층 내부에서 서버 측이 발생합니다.

ViewModel 관용구를 사용하면이 스키마에 몇 가지 문제점이 발생할 수 있습니다. 현재 나의 엔티티 객체 내 뷰 모델 내부, 예 :

UpdateModel(contactViewModel.Contact, "Contact"); 

을 더 많은 정보 나 더 복잡한 계산을 요구하는 검증은 모델 층 자체 내에서 발생 : 모델을 업데이트 할 때

public class Contact { 
    [Required] 
    string Name { get; set; } 
} 

public class ContactView { 
    public Contact Contact { get; set; } 
    public string SomeOtherViewProperty { get; set; } 
} 

는 다음 컨트롤러, 얕은 검증이 발생합니다.

또 다른 접근법은 엔터티 개체를 포함하지 않고 두 필드 사이에 개별 필드를 매핑하는 것입니다. 최근에 도메인과 뷰 모델 객체간에 필드를 자동으로 연결하는 AutoMapper이라는 도구에 대해 알게되었습니다. 아직 사용하지는 않았지만이 유효성 검사 방법을 지원해야하는 것 같습니다.

+0

훌륭한 아이디어, Keith! 지금은 ViewModels에 모델을 포함시키는 것과 같은 전략을 사용합니다. Model과 ViewModel 모두 유효성 검사를 동일한 방식으로 구현할 수 있고 xVal과 같은 JS 프레임 워크가 원활하게 작동 할 수 있다면 좋겠다. 가장 유연한 방법입니다. 밸리데이션은 모델에만 독점적으로 묶여 있어야한다고 저는 생각하지 않습니다. – Jonathan

+0

또한 xVal을 포함하여 모델 클래스가 포함 된 사용자 정의보기 모델을 사용하고 있습니다. 그러나 모델의 속성의 하위 집합 만 포함하도록 내 viewmodel이 필요한 경우가 있습니다. 나는 현재 Automapper에서 해당 모델을 매핑하려고합니다. 그것은 잘 작동하지만 어떻게 그 시나리오에서 xVal을 사용합니까? 메타 데이터 개체가 viewmodel의 일부가 아닌 속성을 포함하는 경우 AssociatedMetadataTypeTypeDescriptionProvider가 throw되기 때문에 MetaData 특성으로 ViewModel을 장식하지 않습니다. Automapper를 사용하신다면,이 문제를 어떻게 해결했는지 알고 싶습니다. –

3

NerdDinner tutorials은 모델의 부분 클래스 (즉, Linq에서 SQL 또는 Entity Framework)에서 발생하는 것으로 확인되었습니다. 그러나 View Models를 사용하고 있으므로 유효성 검증 로직을 배치 할 수 있습니다.

유효성 검사 논리가 컨트롤러에 없습니다. 오히려, 그것은 당좌 속성 컨트롤러, 즉 ModelState.IsValid에서 중독되어

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Dinner dinner) { 

    if (ModelState.IsValid) { 

     try { 
      dinner.HostedBy = "SomeUser"; 

      dinnerRepository.Add(dinner); 
      dinnerRepository.Save(); 

      return RedirectToAction("Details", new { id=dinner.DinnerID }); 
     } 
     catch { 
      ModelState.AddModelErrors(dinner.GetRuleViolations()); 
     } 
    } 

    return View(new DinnerFormViewModel(dinner)); 
} 

전체 세부 사항은 여기에 있습니다 : 여기에 모델
http://nerddinnerbook.s3.amazonaws.com/Part3.htm

및 구축

:

ViewData 및 ViewModel
http://nerddinnerbook.s3.amazonaws.com/Part6.htm

+0

** ** 업데이트 된 NerdDinner는 다음을 참조하십시오. http://nerddinner.codeplex.com/SourceControl/changeset/view/ef63780655b0 –