2012-02-19 3 views
5

유효성을 확인하기 위해 샘플 MVC3 응용 프로그램을 만들었습니다. 그것은 DataAnnotations를 사용하고 있습니다. CustomContactAttribute CustomStartLetterMatch라는 사용자 지정을 만들었습니다. 그것은 "System.Web.Mvc.IClientValidatable"을 구현하고 있습니다. 눈에 거슬리는 jQuery로 작성된 해당 클라이언트 측 코드가 있습니다. 이것은 예상대로 작동합니다.ASP.NET MVC3 : ValidationType ModelClientValidationRule

사용자 정의 유효성 검사기 정보 : 이름 입력과 성 입력을 비교합니다. 두 문자의 첫 문자가 같지 않으면 오류가 발생합니다.

내가 말했듯이, 응용 프로그램이 잘 작동합니다. 그러나 내가 rule.ValidationType = "greaterdate";을 볼 때 나는 혼란스러워했다. 나는 이것을 "anotherDefaultType"과 같은 다른 것으로 변경하고 싶었다. 내가 그것을 바꿀 때, 그것은 jQuery 오류로 실패한다.

  1. 왜 그럴까요?
  2. 사용 가능한 ValidationTypes는 무엇입니까?

    using System; 
    using System.ComponentModel.DataAnnotations; 
    using System.Collections.Generic; 
    namespace MyValidationTEST 
    { 
        public class Person 
        { 
        [Required(ErrorMessage = "First name required")] 
        public string FirstName { get; set; } 
    
        [CustomStartLetterMatch("FirstName")] 
        [StringLength(5,ErrorMessage = "Must be under 5 characters")] 
        public string LastName { get; set; } 
    
        [Range(18,50,ErrorMessage="Must be between 18 and 50")] 
        public int Age { get; set; } 
    
    } 
    
    
    
    public sealed class CustomStartLetterMatch : ValidationAttribute, System.Web.Mvc.IClientValidatable 
    { 
    
        private const string _defaultErrorMessage = " First letter of '{0}' must be same as first letetr of '{1}'"; 
        private string _basePropertyName; 
    
        public CustomStartLetterMatch(string basePropertyName) 
         : base(_defaultErrorMessage) 
        { 
         _basePropertyName = basePropertyName; 
        } 
    
    
        //Override FormatErrorMessage Method 
        public override string FormatErrorMessage(string name) 
        { 
         return string.Format(_defaultErrorMessage, name, _basePropertyName); 
        } 
    
    
        //Override IsValid 
        protected override ValidationResult IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext) 
        { 
         //Get PropertyInfo Object 
         var basePropertyInfo = validationContext.ObjectType.GetProperty(_basePropertyName); 
         var baseValue = (string)basePropertyInfo.GetValue(validationContext.ObjectInstance, null); 
         var currentValue = (string)value; 
    
    
         string firstLetterBaseValue = baseValue.Substring(0, 1); 
         string firstLetterCurrentValue = currentValue.Substring(0, 1); 
    
         //Comparision 
         if (!string.Equals(firstLetterBaseValue, firstLetterCurrentValue)) 
         { 
          var message = FormatErrorMessage(validationContext.DisplayName); 
          return new ValidationResult(message); 
         } 
    
         //Default return - This means there were no validation error 
         return null; 
        } 
    
    
        public IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(System.Web.Mvc.ModelMetadata metadata, System.Web.Mvc.ControllerContext context) 
        { 
         var rule = new System.Web.Mvc.ModelClientValidationRule(); 
         rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); 
         rule.ValidationParameters.Add("other", _basePropertyName); 
         rule.ValidationType = "greaterdate"; 
         yield return rule; 
        } 
    
    
    
    } 
    

    }

    VIEW

    @model MyValidationTEST.Person 
    
    @{ 
    ViewBag.Title = "Create"; 
    } 
    
    <h2>Create</h2> 
    
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"> </script> 
    
    @*UnObtrusive*@ 
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
    
    
    
    <script type="text/javascript"> 
    
    /*Register adapter - addSingleVal*/ 
    jQuery.validator.unobtrusive.adapters.addSingleVal("greaterdate", "other"); 
    
    
    /*Validation type names in unobtrusive client validation rules must consist of only lowercase letters*/ 
    
    /*Add Method*/ 
    jQuery.validator.addMethod("greaterdate", 
                function (val, element, other) 
                { 
    
                 var modelPrefix = element.name.substr(0, element.name.lastIndexOf(".") + 1) 
                 var otherVal = $("[name=" + modelPrefix + other + "]").val(); 
    
                 if (val && otherVal) 
                 { 
                  var lastNameFirstLetter = val.substr(0, 1); 
                  var firstNameFirstLetter = otherVal.substr(0, 1); 
    
                  if (lastNameFirstLetter != firstNameFirstLetter) 
                  { 
                   return false; 
                  } 
                 } 
                 return true; 
                }); 
    
    
    </script> 
    
    
    @using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
        <legend>Person</legend> 
    
        <div class="editor-label"> 
         @Html.LabelFor(model => model.FirstName) 
        </div> 
        <div class="editor-field"> 
         @Html.EditorFor(model => model.FirstName) 
         @Html.ValidationMessageFor(model => model.FirstName) 
        </div> 
    
        <div class="editor-label"> 
         @Html.LabelFor(model => model.LastName) 
        </div> 
        <div class="editor-field"> 
         @Html.EditorFor(model => model.LastName) 
         @Html.ValidationMessageFor(model => model.LastName) 
        </div> 
    
        <div class="editor-label"> 
         @Html.LabelFor(model => model.Age) 
        </div> 
        <div class="editor-field"> 
         @Html.EditorFor(model => model.Age) 
         @Html.ValidationMessageFor(model => model.Age) 
        </div> 
    
        <p> 
         <input type="submit" value="Create" /> 
        </p> 
    </fieldset> 
    } 
    
    <div> 
    @Html.ActionLink("Back to List", "Index") 
    </div> 
    

    CONTROLLER :

    ,536
  3. 이 scenari

코드의 ValidationType을 변경하는 제안 된 방법 무엇입니까

using System.Web.Mvc; 
namespace MyValidationTEST.Controllers 
{ 
public class RelativesController : Controller 
{ 

    // GET: /Relatives/ 
    public ActionResult Index() 
    { 
     return View(); 
    } 



    // GET: /Relatives/Create 
    public ActionResult Create() 
    { 
     Person person = new Person(); 
     return View(person); 
    } 


    // POST: /Relatives/Create 
    [HttpPost] 
    public ActionResult Create(Person relativeToAdd) 
    { 
     if (ModelState.IsValid) 
     { 
      return RedirectToAction("Index"); 
     } 
     return View(relativeToAdd); 
    } 

    } 

} 

는 READING :

ASP.NET MVC3 - Custom validation attribute -> Client-side broken

+0

'rule.ValidationType = "greaterdate";를 변경 했습니까? 아니면 일치하도록 자바 스크립트 코드를 변경 했습니까? –

+0

3 곳에서 변경했습니다. 1) rule.ValidationType = "greaterdate"2) Javascript로 어댑터 등록. 3) 자바 스크립트에서 addmethod – Lijo

+0

너무 컨트롤러 코드를 추가 했으므로 오류를보기 위해 직접 시도 할 수 있습니다. – Lijo

답변

8

나는 다른 "anotherDefaultType"와 같은 무언가로 변경을 원

당신은 ValidationType 속성 소문자 사용할 수 있습니다

:

rule.ValidationType = "anotherdefaulttype"; 

jQuery.validator.unobtrusive.adapters.addSingleVal("anotherdefaulttype", "other"); 
jQuery.validator.addMethod("anotherdefaulttype", function (val, element, other) { 
    ... 
}); 
+1

감사장 :) – Rajpurohit