asp.net MVC 에서 더욱 강력한 validation 도우미 xVal - 04

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (4/22/2011 10:47:19 AM) Viewing : 2274

네번째 시간입니다..헥헥..

이전글 에 밝혔듯이 이번 시간엔 Class에 정의 하는 특성에 대해서 알아 보도록 하겠습니다.

/// <summary>
/// <para>두개의 문자열의 값이 같은지 검사하는 검사기 특성입니다.</para>
/// </summary>
/// <remarks> 2010.12.28 - Prototype - 이방은(www.bangsil.net) </remarks>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public sealed class SamePasswordAttirbute : ValidationAttribute, ICustomRule
{
    /// <summary>
    /// 첫번째 값을 가리키는 속성의 이름을 가져오거나 설정합니다.
    /// </summary>
    /// <value>The first name of the property.</value>
    public string FirstPropertyName { get; set; }

    /// <summary>
    /// 두번째 값을 가리키는 속성의 이름을 가져오거나 설정합니다.
    /// </summary>
    /// <value>The name of the second property.</value>
    public string SecondPropertyName { get; set; }

    /// <summary>
    /// 오류가 발생한 데이터 필드를 기반으로 오류 메시지에 형식을 적용합니다.
    /// </summary>
    /// <param name="name">오류가 발생한 데이터 필드의 이름입니다.</param>
    /// <returns>형식 지정된 오류 메시지의 인스턴스입니다.</returns>
    public override string FormatErrorMessage(string name)
    {
        return String.Format(this.ErrorMessageString);
    }

    /// <summary>
    /// 개체의 지정된 값이 유효한지 여부를 확인합니다.
    /// </summary>
    /// <param name="value"><see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"/>가 선언된, 지정된 유효성 검사 개체의 값입니다.</param>
    /// <returns>지정된 값이 유효하면 true이고, 그렇지 않으면 false입니다.</returns>
    public override bool IsValid(object value)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
        object firstValue = properties.Find(this.FirstPropertyName, true).GetValue(value);
        object secondValue = properties.Find(this.SecondPropertyName, true).GetValue(value);
        return Object.Equals(firstValue, secondValue);
    }

    #region ICustomRule 멤버

    /// <summary>
    /// Toes the custom rule.
    /// </summary>
    /// <returns></returns>
    public CustomRule ToCustomRule()
    {
        return new CustomRule("validateSamePassword", new { this.FirstPropertyName, this.SecondPropertyName }, this.FormatErrorMessage(null));
    }

    #endregion
}

14행을 보게 되면 AttributeUsage 특성의 AttributeTargets 속성에 Class 라고 지정되어 있는걸 확인 할 수 있습니다. 즉 클래스에서 사용하는 특성이라는 것이겠죠.

11행의 주석에 있듯이 이 특성은 2개의 문자열이 같은지 검사하는 특성입니다.

비밀번호 확인에서 사용되고 있는 특성이지요.

주어진 속성은 2개가 있습니다. FirstPropertyName과 SecondPropertyName 이 있네요.

44행의 IsValid 메서드를 보시죠.

2개의 속성에 주어진 값, 이 값은 비교를 할 속성의 이름이 되겠네요.

이름으로 해당 속성의 값을 얻어 와서 같은지 비교하는 코드가 되겠습니다.

그 결과 같으면 true , 그렇지 않으면 false가 되겠네요.

58행의 메서드에서는 클라이언트 스크립트로 넘겨줄 매개변수를 정해줍니다.

validateSavePassword 라는 함수와 2개의 매개변수를 넘겨 줍니다.

 

이제 클라이언트 스크립트 메서드를 봅시다.

function validateSamePassword(value, element, params) {
    return value != null && value == $('#' + params.FirstPropertyName).val();
};

뭐 초 간단합니다..^^;

이 특성의 사용법은 아래와 같습니다.

[SamePasswordAttirbute(FirstPropertyName = "Password", SecondPropertyName = "ConfirmPassword", ErrorMessage = "비밀번호와 비밀번호 확인의 값이 다릅니다.")]
public class Register
{
    [Required(ErrorMessage = "비밀번호를 입력하여 주십시오.")]
    [DataType(DataType.Password)]
    [MaxMinStringLength(16, ErrorMessage = "비밀번호의 글자수는 {0}보다 크고 {1}보다 작아야 합니다.")]
    [DisplayName("비밀번호")]
    public string Password { get; set; }

    [Required(ErrorMessage = "비밀번호 확인을 입력하여 주십시오.")]
    [DataType(DataType.Password)]
    [MaxMinStringLength(16, ErrorMessage = "비밀번호의 글자수는 {0}보다 크고 {1}보다 작아야 합니다.")]
    [DisplayName("비밀번호 확인")]
    public string ConfirmPassword { get; set; }
}

이해 되시죠?

여기 까지는 Field나 Property에 붙는 특성과 같습니다.

실제로 여기까지 해 놓고 컴파일후 실행을 해보면..클라이언트의 Validation 체크는 하지 않지만 서버의 Validation 체크는 하는 걸 보실수 있습니다.

클래스에 적용하는 Validator의 경우에는 asax 파일에 추가로 RuleProvider를 등록을 해주어야 합니다.

이제 그러한 RuleProvider를 생성해 보도록 하겠습니다.

/// <summary>
/// <para><see cref="SamePasswordAttribute"/> 특성을 클라이언트 코드에서도 사용할 수 있게 설정하는 <see cref="IRulesProvider"/>의 파생 클래스입니다.</para>
/// </summary>
/// <remarks> 2010.12.28 - Prototype - 이방은(www.bangsil.net) </remarks>
public class SamePasswordRulesProvider : CachingRulesProvider
{
    /// <summary>
    /// Gets the rules from type core.
    /// </summary>
    /// <param name="type">The type.</param>
    /// <returns></returns>
    protected override RuleSet GetRulesFromTypeCore(Type type)
    {
        IEnumerable<SamePasswordAttirbute> comparisonRules = type.GetCustomAttributes(typeof(SamePasswordAttirbute), true).Cast<SamePasswordAttirbute>();
        return new RuleSet(comparisonRules.ToLookup(x => x.SecondPropertyName, x => (Rule)x.ToCustomRule()));
    }
}

CachingRuleProvider는 xVal에 있는 클래스가 되겠습니다.

여기서 GetRulesFromTypeCore() 메서드만 재정의 해 주시면 되겠습니다.

그리고 마지막으로 이 RuleProvider를 global.asax 파일에 등록해 주시면 되겠네요.

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterRoutes(RouteTable.Routes);

    ControllerBuilder.Current.SetControllerFactory(new CastleWindsorControllerFactory());

    ActiveRuleProviders.Providers.Add(new SamePasswordRulesProvider());
    ActiveRuleProviders.Providers.Add(new RestrictDateRulesProvider());
    ActiveRuleProviders.Providers.Add(new RestrictValueRulesProvider());
    ActiveRuleProviders.Providers.Add(new DateCompareRulesProvider());
}

위 9행 처럼 말이지요..

이렇게 하고 컴파일후 실행을 해보면 html 코드 상의 xVal.AttachValidator() 스크립트 블럭내부에

{"RuleName":"Custom","RuleParameters":{"Function":"validateSamePassword","Parameters":"{\"FirstPropertyName\":\"Password\",\"SecondPropertyName\":\"ConfirmPassword\"}"},"Message":"비밀번호와 비밀번호 확인의 값이 다릅니다."}]}

와 같은 코드 블럭이 추가됩니다.

다음 시간은 마지막시간으로 ..

xVal과 같이 배포된 xVal.jquery.validate.js에 대해 아주..간략하게만 살펴 보도록 하겠습니다.


마지막 업데이트 : (4/22/2011 10:47:19 AM)

TAG : validation MVC jquery xVal 



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

에버랜드 꽃놀이..

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (4/17/2011 8:55:50 PM) Viewing : 2376

날씨도 화창하여 가족들과 함께 에버랜드에 다녀 왔습니다.

요즘 튤립축제라고 하여 꽃 구경 갔었는데..꽃보다 사람이 더 많더군요..ㅎㅎ

우리 지석이는 꽃보다..자동차가 더 좋은 모양입니다.

자동차를 타더니 함박웃음이네요.

Get Microsoft Silverlight

저는 온 몸이 쑤시네요..


마지막 업데이트 : (4/17/2011 8:57:18 PM)

TAG : 없음



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

게시판의 MVC Route 구성하기

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (4/1/2011 3:28:23 PM) Viewing : 2507

MVC에서 라우팅은 참 중요한 부분입니다.

이 라우팅을 어떻게 구성하느냐에 따라 url이 달라지죠..

제가 이 사이트의 라우팅을 구성할 때에도 여러번의 시행 착오를 겪었습니다.

그 결과..현재의 라우팅 구성을 갖게 되었습니다.

Global.asax 파일에 구성되는 라우트의 값들은 Inbound 라우트와 outbound 라우트를 모두 충족해야 합니다.

이게 여의치 않다면 이전글에서 밝혔듯이 MVC-Outbound Route 처리 하기 처럼 구성 하는 방법도 있겠습니다.

현재는 이 방법은 제거 했습니다. 굳이 이걸 사용하지 않아도 되도록 라우트를 구성했기 때문이죠..

이 사이트에서 구성된 라우트는 많지만 그중에 게시판 관련 된것을 추려서 공개 합니다.

routes.MapRoute(null,
      "{categoryUrlName}/{postCategoryUrlName}/{postId}",
      new { controller = "Post", action = "Index", page = 1},
      new { categoryUrlName = new BoardCategoryConstraint(), postCategoryUrlName = new PostCategoryConstraint(), postId = new GuidConstraint() }
  );

routes.MapRoute(null,
    "{categoryUrlName}/{postCategoryUrlName}",
    new { controller = "Post", action = "Index", page = 1 },
    new { categoryUrlName = new BoardCategoryConstraint(), postCategoryUrlName = new PostCategoryConstraint() }
);

routes.MapRoute(null,
    "{postId}",
    new { controller = "Post", action = "Index", page = 1 },
    new { postId = new GuidConstraint() }
);

routes.MapRoute(null,
   "{categoryUrlName}",
   new { controller = "Post", action = "Index", page = 1 },
   new { categoryUrlName = new BoardCategoryConstraint() }
);

routes.MapRoute(null,
    "{categoryUrlName}/{action}/{postId}",
    new { controller = "Post", action = "Index", page = 1},
    new { categoryUrlName = new BoardCategoryConstraint(), postId = new GuidConstraint() }
);

routes.MapRoute(null,
    "{categoryUrlName}/{postCategoryUrlName}/Page{page}",
    new { controller = "Post", action = "Index", page = 1 },
    new { categoryUrlName = new BoardCategoryConstraint(), postCategoryUrlName = new PostCategoryConstraint(), page = @"\d+" }
);

routes.MapRoute(null,
    "{categoryUrlName}/{postCategoryUrlName}/{action}",
    new { controller = "Post", action = "Index", page = 1},
    new { categoryUrlName = new BoardCategoryConstraint(), postCategoryUrlName = new PostCategoryConstraint() }
);

routes.MapRoute(null,
    "{categoryUrlName}/Page{page}",
    new { controller = "Post", action = "Index", page = 1 },
    new { categoryUrlName = new BoardCategoryConstraint(), page = @"\d+" }
);

routes.MapRoute(null,
    "{categoryUrlName}/{action}",
    new { controller = "Post", action = "Index"},
    new { categoryUrlName = new BoardCategoryConstraint() }
);

routes.MapRoute(null,
   "Page{page}",
   new { controller = "Post", action = "Index" },
   new { page = @"\d+" }
);

routes.MapRoute(null,
   "",
   new { controller = "Post", action = "Index", page = 1 }
); 

라우트의 가장 중요한 원칙은 위에서부터 읽는다 입니다.

라우트가 URL 요청을 받았을 경우 Rule에 합당한 라우트 구성이 있는데까지 검색하는 방법은 위에서부터 순차적이다 라는 의미가 되겠습니다.

요청된 url에 합당한 라우트가 여러개 있을 경우 라우트의 배치 순서를 잘 하지 않으면 의도하지 않는 결과를 보게 됩니다.

개발자의 의지와는 전혀 다른 라우트를 선택하게 되죠..

이를 위해서는 엄정한 제약 조건와 요청되는 url의 형식에 대해서 잘 알아야 하겠습니다.

먼저 140행의 라우트를 보게 되면 이 글의 주소 처럼..해당 글의 주소를 가리키는 url형식이 되겠습니다.

/MyPosts/DotNet3x/글아이디 와 같은 형식이 되는 것이죠.

라우트의 첫번째 인자는 이 라우트의 이름이 됩니다.

실제적으로 코드 상에서 특정 라우트를 선택하는 경우 이 이름으로 선택하게 되죠..하지만 이렇게 이름으로 지정해서 쓰다보면  엄청나게 꼬이는 수가 생깁니다..ㅋㅋ 첨엔 쉽지만요..

두번째 인자는 라우트할 url의 패턴입니다.

중괄호 안에 전달 받은 라우트 변수 컬렉션의 인자값 중에 하나가 들어 가죠..

세번째 인자는 기본값입니다. controller와 action 그리고 action 메서드의 매개변수가 되지요..

이것이 정의되지 않은 채 호출 된다면 이 기본값을 따라 정의가 됩니다.

네번째 인자는 제약 조건입니다.

143행을 보면 categoryUrlName 이라는 것은 BoardCategoryConstraint 클래스에 의해 제약을 받습니다.

이 모든게 true가 된다면 이 라우트는 선택이 됩니다.

이 라우트를 선택하게 하는 ActionUrl은 다음과 같습니다.

 

Url.Action("Index","Post", new { categoryUrlName="MyPosts", postCategoryUrlName="DotNet3x", postId="게시물아이디" })

위 코드는 140행의 모든 라우트 규칙을 통과 하고 있습니다. 그렇기에 위 코드는 140행의 라우트를 선택하게 됩니다.

public class BoardCategoryConstraint : IRouteConstraint
{
    #region IRouteConstraint 멤버

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        bool hasItem = CachedData.GetBoardCategories().Exists(m => m.UrlName.ToLower() == values[parameterName].ToString().ToLower());
        return hasItem;
    }

    #endregion
}

위 코드는 캐시에 저장된 게시판 카테고리 목록에서 현재 요청된 url의 categoryUrlName 의 값이 들어 있는지 보는 제약조건 클래스입니다.

이러한 방법으로 제약 조건을 만들면 되겠습니다.

물론 185행 처럼 간단한게 RegularExpression으로 구성할 수도 있습니다.

new { categoryUrlName = new BoardCategoryConstraint(), page = @"\d+" }

page에는 정수형만 받는다는 의미가 되겠군요..

 

--------------------------------------------------------------------------------------

라우팅 구성은 코드로 보기엔 어려울게 하나도 없습니다.

요청되는 url의 패턴만 명확히 알고 있으면 되거든요..

중요한것은 그 패턴에 따라 라우트를 구성하고 그것을 순서에 맞게 배치하는게 문제지요..

개발에 들어 가기 전에 이 모든 것으 체계있게 하여 라우트 구성을 끝마친후 개발에 들어 가면 얼마나 좋겠습니까..만..

저도 하다보니까..그게 그리 쉽지만은 않더군요..ㅋ~

어떠한 상황에 있어 새로운 라우트 패턴을 추가 하게 되는 경우, 기존 코드에서는 어떤 현상이 벌어 질까요.

어쩌면..지금까지 잘되는 라우트가 이상작동을 하는 경우가 있을 수 있습니다.

새로 추가된 라우트 패턴이 기존의 것과 중복되는 경우 , 정의된 순서대로 위에서 부터 순차적으로 검증하여 적용되는 라우터의 법칙에 따라 개발자가 의도하지 못한 라우트가 선택될 수 있게 됩니다.

이러한 경우엔 대략 낭패가 됩니다.

지금까지 구현해 놓은 많은 코드들을 모조리 다 검증해야 하는 일이 벌어 집니다...

OTL.....

-------------------------------------------------------------------------------------------------------------------------

실제로 이러한 상황은 비일비재합니다..ㅡㅡ;;;;

이것을 어떻게 해결해 볼까요.

이것을 해결하기 위한 하나의 방법으로 단위테스트가 있습니다.

각각의 라우트에 단위테스트를 해 놓는 다면 새로운 패턴이 추가되었을 경우 어떠한 라우트에서 예기치 않은 상황이 발생되는지 바로 캐치할 수가 있습니다.

그에 따라서 라우트 구성을 바꿀 수가 있게 되는 거죠..

라우트를 호출하는 Action을 변경하는게 아닙니다...^^;

다음 글에서는 바로..이 방법

라우트의 단위 테스트에 대해서 알아 보도록 하겠습니다.


마지막 업데이트 : (4/1/2011 3:28:23 PM)

TAG : MVC Route 



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

x64에서 버림받은 J#을 돌릴 수 있을까?

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (3/31/2011 6:07:30 PM) Viewing : 2479

음...

앞서 프로그램에서 엑셀(Excel)을 다루어 보자.(5) 에서 잠깐 언급했듯이 MS에서 J#은 버린것 같군요..ㅋㅋ

어쨋든 위 글을 쓰는데 도움을 주었던 팀원 연X정씨가 또 리포트를 줬네요..끌끌...

서버에 배포를 하는데..아래와 같은 오류가 나온답니다.

x64 서버에서 J#으로 컴파일된 어셈블리를 찾지 못하는 경우가 되겠습니다.

ㅡ.ㅠ;

이것 저것 구글링을 해보니...

J# 컴파일러는 x86전용이라는 내용을 찾을 수가 있었죠..

이제 이것을 해결하기 위해 삽질을 했습니다.

-------------------------------------------------------------------------------------------------------------------------

결론은 IIS를 32비트용으로 설정하면 된다 네요...

굳이 64비트 용으로 써야 한다면 jakarta.POI는 포기를 해야 할 듯 싶네요..ㅡ.ㅠ;

32비트 용으로 변경하기 위한 법은 다음과 같습니다.

IIS를 띄웁니다.

응용 프로그램 풀을 선택합니다.

해당 사이트가 사용하는 응용프로그램 풀을 선택합니다.

고급 설정을 선택합니다.

일반 항목에 32비트 응용 프로그램 사용 항목을 True로 변경합니다.

 

이제..실행됩니다..

------------------------------------------------

다행히 아직까지도 jakarta.POI를 써도 되겠네요..ㅡ.ㅠ;

 

 


마지막 업데이트 : (3/31/2011 6:08:05 PM)

TAG : 엑셀 excel 



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

asp.net MVC 에서 더욱 강력한 validation 도우미 xVal - 03

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (3/31/2011 10:58:32 AM) Viewing : 2553

세번째 시간입니다..

이전 글에서 약속 했듯이 이번 시간엔 사용자 정의 유효성 검사기를 만들어 보겠습니다.

 

MVC에서는 유효성 검사기의 종류가 몇 개 있습니다.

가장 먼저 FCL에 속해 있는 DataAnnotations 네임스페이스를 이용하는 방법입니다.

이 네임스페이스에 속해있는 각종 유효성 검사기 특성들을 이용하는 방법이 되겠습니다.

1년도 넘은 글이지만 구스리 아저씨의 블로그에 자세한 설명이 되어 있네요.

 

몇가지 추가적인 코드가 더 들어 가야 하지만 Castle Validator 도 있지요.

NHibernate Validator도 있네요..

 

뭐 여러가지가 있지만..제가 선택한 것은 DataAnnotation 입니다.

자 이제 xVal과 DataAnnotation을 어떻게 이용하여 새로운 사용자 정의 Validator를 만들수 있는지 살펴 보도록 하겠습니다.

가장 간단한 MaxMinStringLengthAttribute 를 만들어 보겠습니다.

일단 전체 코드를 보시죠..짧으니까...

/// <summary>
/// <para>문자열의 길이가 허용범위내에 있는지 검사하는 검사기 특성입니다.</para>
/// </summary>
/// <remarks> 2010.12.28 - Prototype - 이방은(www.bangsil.net) </remarks>
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class MaxMinStringLengthAttribute : ValidationAttribute, ICustomRule
{
    /// <summary>
    /// 문자열의 최대 허용길이를 가져오거나 설정합니다.
    /// </summary>
    /// <value>The length of the max.</value>
    public int MaxLength { get; private set; }

    /// <summary>
    /// 문자열의 최소 허용길이를 가져오거나 설정합니다.
    /// </summary>
    /// <value>The length of the min.</value>
    public int MinLength { get; private set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="MaxMinStringLengthAttribute"/> class.
    /// </summary>
    /// <param name="maxLength">Length of the max.</param>
    public MaxMinStringLengthAttribute(int maxLength)
    {
        this.MaxLength = maxLength;
        this.MinLength = Membership.Provider.MinRequiredPasswordLength;
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="MaxMinStringLengthAttribute"/> class.
    /// </summary>
    /// <param name="maxLength">Length of the max.</param>
    /// <param name="minLength">Length of the min.</param>
    public MaxMinStringLengthAttribute(int maxLength, int minLength)
    {
        this.MaxLength = maxLength;
        this.MinLength = minLength;
    }

    /// <summary>
    /// 오류가 발생한 데이터 필드를 기반으로 오류 메시지에 형식을 적용합니다.
    /// </summary>
    /// <param name="name">오류가 발생한 데이터 필드의 이름입니다.</param>
    /// <returns>형식 지정된 오류 메시지의 인스턴스입니다.</returns>
    public override string FormatErrorMessage(string name)
    {
        return String.Format(this.ErrorMessageString, this.MinLength, this.MaxLength);
    }

    /// <summary>
    /// 개체의 지정된 값이 유효한지 여부를 확인합니다.
    /// </summary>
    /// <param name="value"><see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"/>가 선언된, 지정된 유효성 검사 개체의 값입니다.</param>
    /// <returns>지정된 값이 유효하면 true이고, 그렇지 않으면 false입니다.</returns>
    public override bool IsValid(object value)
    {
        string valueAsString = value as string;
        if (String.IsNullOrEmpty(valueAsString))
        {
            return true;
        }
        else
        {
            return (valueAsString != null && valueAsString.Length >= this.MinLength && valueAsString.Length <= this.MaxLength);
        }
    }

    #region ICustomRule 멤버

    /// <summary>
    /// Toes the custom rule.
    /// </summary>
    /// <returns></returns>
    public xVal.Rules.CustomRule ToCustomRule()
    {
        return new CustomRule("validateMaxMinStringLength", new { this.MinLength, this.MaxLength }, this.FormatErrorMessage(null));
    }

    #endregion
}

일단  17행의 의미는 이 특성은 Field와 Property에서만 사용가능 하다는 걸 정의 합니다.

18행에서 하나의 특성 클래스를 상속받고 하나의 인터페이스를 구현합니다.

ValidationAttribute 는 DataAnnotations 네임스페이스에 정의된 클래스로 사용자 정의 Validator를 만들기 위해서는 받드시 상속 받아야 하는 클래스가 되겠습니다.

ICustomRule 인터페이스는 xVal에 있는 인터페이스로 클라이언트측 유효성 검사와 연결 시켜 줍니다. 이 인터페이스를 구현하지 않으면 클라이언트측 유효성검사는 진행되지 않습니다.

ValidationAttribute에서 구현해야 하는 메서드는 2개가 있습니다.

58행의 FormatErrorMessage 메서드와 68행의 IsValid 메서드가 바로 그것입니다.

58행의 FormatErrorMessage 메서드는 유효성 검사에 실패 했을 경우 출력되는 문자열을 반환합니다.

68행의 IsValid 메서드는 실제로 유효성 검사를 하는 로직이 있습니다.

위 클래스의 경우에는 인풋 문자열의 길이가 미리 정의된 Max, Min 값의 범위 안에 있는지 검사합니다. 범위 안에 있으면 true , 그렇지 않으면 false 가 되겠지요.

이제 유효성 검사기는 완료 되었습니다. 서버측 검사는 잘 될겁니다..^^;

이제 클라이언트 검사코드를 작성 해야 겠지요?

87행에 보면..CustomRule이라는 생성자를 호출합니다.

이 생성자는 여러개가 정의되어 있지만..지금 사용하고 있는 것 하나면 충분하더군요..ㅡ.ㅡ;;;

어쨋든 첫번째 매개변수는 클라이언트의 유효성검증을 할 자바스크립트 메서드 이름이 되겠습니다.

두번째는 전달해줄 매개변수가 되겠고요.. 세번째는 유효성 검증 실패시에 화면에 보여줄 메시지가 되겠습니다.

이제 validateManMinStringLength 라는 스크립트 메서드만 구현하면 되겠군요..^^;

function validateMaxMinStringLength(value, element, params) {
    return value != null && value.length >= params.MinLength && value.length <= params.MaxLength;
};

스크립트에도 3개의 매개변수가 존재합니다.

value는 사용자의 입력값입니다. element는 해당 dom 개체가 되겠네요..

params는 서버에서 클라이언트로 전달하는 매개변수가 되겠습니다.

서버 코드의 new { this.MinLength, this.MaxLength } 이부분이 되겠지요.

스크립트 코드는 간단하니까...패스 하겠습니다.

 

자 이제 끝입니다.

현재 이 사이트에서 이 특성은 비밀번호, 아이디 입력 하는 곳에 걸려 있지요..

-------------------------------------------------------------------------------------------------------------------------------------------

위 예제는 Field, Property에 정의를 하는 특성이었습니다.

그런데 Class에 정의를 하는 특성은 약간 추가적인 코드가 필요합니다.

다음시간에 살펴 보지욥..


마지막 업데이트 : (3/31/2011 11:01:21 AM)

TAG : validation MVC jquery xVal 



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기



<< < 1 2 3 4 5 6 7 8 9 10 > >>