2011-01-11 5 views
2

pro asp.net mvc 2.0 프레임 워크를 읽었으며 유효성 검증을 위해 사용해야하는 부분이 약간 혼란 스럽습니다. 여기서는 동일한 코드를 계속 작성하지 않아도되는지 확인해야합니다.유효성 검사 및 Asp.net Mvc 2.0 모범 사례?

내 사이트는 거의 모든 jax와 아약스 경향이 있습니다. 그래서 저는 보통 클라이언트 쪽에서 jquery.validate를 사용했고 서버 쪽에서는 다시 검사를했습니다. 서버 측에서 실패하거나 클라이언트 측에서 테스트 할 수없는 유효성 검사 규칙이 있다면 오류 메시지를 반환합니다.

이런 식으로 몇 가지를 빨아들입니다. 먼저 오류 메시지가 클라이언트 측과 서버 측에서 동일해야합니다. 그래서 나는 항상 2 개의 중복 된 메시지를 가질 것이다.

그래서 단어의 철자를 잘못 입력하면 2 개 장소에서 단어를 변경해야한다는 것을 기억해야합니다. 둘째로 서버 측 오류를 반환하기가 어렵습니다 (대부분의 사이트는 거의 모든 아약스입니다). 그래서 내가 한 것은 항상 깃발을 확인해야한다는 것입니다.

$.post('Create',{'test',test},function(response) 
{ 
    if(response.IsValid == false) 
    { 
     // check other json parameters to get all error msgs 
     // add them to some div container and display to user. 
    } 
    else 
    { 
     // show success msg. 
    } 
}): 

데이터 주석을보고 있었지만 아약스 게시물을 사용하고 있기 때문에 그들이 도움이되는지 확신 할 수 없습니다.

아약스 게시물에 연결되어있는 버튼을 클릭해도 클라이언트 측 코드가 계속 표시됩니까?

전 페이지 렌더링이 필요한 html 유효성 확인 도우미를 찾는 데 의존하지 않으므로 서버 쪽 메시지가 표시되지 않을 것이라고 추측하고 있습니까?

나는 또한 그것들을 꽤 제한하고있다. 나는 당신이 당신 자신의 것을 작성할 수 있다는 것을 알고 있지만, 그것은 (서버 측과 클라이언트 측 코드를 작성하는) 많은 것으로 보인다. 특히, jquery가 제공하는 모든 것을 기본적으로 작성해야하기 때문에 그렇다.

jquery.validate (원격 jquery.validate 포함)에서 데이터 주석을 사용할 수있는 활동이 업데이트 된 라이브러리가 있습니까?

마침내이 코드의 위치를 ​​알 수 없습니다. 이 책의 저자는 저를 혼란스럽게합니다.

그는 그는 veiw 모델로 보이는 기본적인 검증이

public class Appointment 
    { 
     [Required(ErrorMessage = "Please enter your name")] [StringLength(50)] 
     public string ClientName { get; set; } 

     [DataType(DataType.Date)] [Required(ErrorMessage = "Please choose a date")] 
     public DateTime AppointmentDate { get; set; } 
    } 

있습니다. 나는 이것을 이해하지만 나를 혼란스럽게하는 것은 서비스 클래스에서 다시 기본적인 검증과 비즈니스 검증을 수행한다는 것입니다.

namespace BookingsExample.Domain.Services 
{ 
    public class AppointmentService 
    { 
     public static void CreateAppointment(Appointment appt) 
     { 
      EnsureValidForCreation(appt); 
      // To do: Now save the appointment to a database or wherever 
     } 

     private static void EnsureValidForCreation(Appointment appt) 
     { 
      var errors = new RulesException<Appointment>(); 

      if (string.IsNullOrEmpty(appt.ClientName)) 
       errors.ErrorFor(x => x.ClientName, "Please specify a name"); 

      if (appt.AppointmentDate < DateTime.Now.Date) 
       errors.ErrorFor(x => x.AppointmentDate, "Can't book in the past"); 
      else if ((appt.AppointmentDate - DateTime.Now.Date).TotalDays > 7) 
       errors.ErrorFor(x => x.AppointmentDate, "Can't book more than a week in advance"); 

      if (appt.ClientName == "Steve" && appt.AppointmentDate.DayOfWeek == DayOfWeek.Saturday) 
       errors.ErrorForModel("Steve can't book on weekends"); 

      if (errors.Errors.Any()) 
       throw errors; 
     } 
    } 
} 

그냥 모델 층은 ASP.NET MVC에 내장 된 검증 지원을 사용 정지 것은 아닙니다 자신의 규칙을 적용하기 때문이다. 나는 ASP.NET MVC의 유효성을 메커니즘을 유용한 방어의 유용한 첫 번째 라인으로 생각하는 것이 도움이된다는 것을 안다. 클라이언트 측 유효성 검사 스크립트를 생성하는 것이 매우 효과적이다. 각 뷰 모델 클래스는 데이터 주석을 사용할 수 있습니다 : 그것은 (비즈니스 로직을 보유하지 않는 컨트롤러와 뷰와 사이 데이터를 전송하는 데에만 존재하는 간단한 뷰 특정 모델을 가진, 즉) 뷰 모델 패턴 으로 깔끔하게 에 맞는 클라이언트 측 구성을위한 특성

그래도 도메인 계층이 사용자 인터페이스를 신뢰하여 비즈니스 규칙을 적용해서는 안됩니다. 실제 적용 코드는 을 사용하여 도메인에 들어가야합니다. 마치 과 같은 기술을 사용합니다. *

  • 이 프로의 asp.net MVC 2.0 프레임 워크 책 장에서 12.
그는이 그래서 그는 서비스 계층을 가지고에 사용할 수 있습니다 않는 이유를 나는 일종의 이해할 수

다른 프로젝트 (즉, 사이트의 일부 모바일 애플리케이션이 있고 동일한 비즈니스 로직을 사용해야 함).

그러나 그는 2 개의 장소에서 동일한 메시지 중 일부를 쓰고 있고 이제는 2 개 장소에서 메시지를 업데이트해야한다는 점이 다소 중복되어 보입니다. 나는 또한 그가 왜 서버 측에서 테스트되고 안전해야하기 때문에 "UI"가 검증을 신뢰하지 않는지 확신 할 수 없다.

그러면 서비스 계층에 모든 것을 포함시키는 것이 더 좋지 않을까요? 또는 유효성 검사를 위해 뷰 모델에 간단한 필수 필드를 유지하는 것이 더 낫습니다.

+0

컨트롤러 수준의 유효성 검사는 실제로 중복되어 (완전히) 바보입니다. – Sapph

답변

1

데이터 주석은 서버에서 개체의 유효성을 검사하는 최상의 솔루션입니다. 코드 숨김/컨트롤러, 서비스 계층 또는 데이터 액세스 계층에서 유효성을 검사 할 수 있습니다.

불행히도 데이터 주석과 jquery.validate를 통합하는 솔루션은 없으므로 클라이언트 스크립트에서 사용자 정의 유효성 검사 코드를 사용해야합니다. 중앙 집중식 유효성 검사를 원할 경우 Data 주석을 통해 서버의 Appointment 객체를 확인하고 json 결과를 클라이언트에 반환하는 유효성 검사 서비스 (json)에 ajax 호출을 할 수 있습니다. 응답은 UI 디스플레이를 작성하는 데 사용할 수있는 단순한 부울 값 또는보다 복잡한 객체가 될 수 있습니다.

+0

+1 이제 데이터 견적을 jQuery 유효성 검사 및 AJAX와 통합하기 위해이 접근법을 시작하기 위해 몇 가지 URL이나 참조를 제공 할 수 있습니까? –