2012-02-19 78 views
5

我刚创建了一个示例MVC3应用程序来学习验证。它使用DataAnnotations。我创建了一个名为CustomStartLetterMatch的自定义ValidationAttribute。它正在实现“System.Web.Mvc.IClientValidatable”。我使用不显眼的jQuery编写了相应的客户端代码。这是按预期工作的。ASP.NET MVC3:ValidationType ModelClientValidationRule

关于自定义验证程序:它比较名字输入和姓氏输入。如果两者的第一个字符不相同,则会引发错误。

正如我所说的,应用程序工作正常。但是当我看到rule.ValidationType = "greaterdate";时,我感到困惑。我想把它改成别的东西,比如“anotherDefaultType”。当我改变它时,它会因jQuery错误而失败。

  1. 这是什么原因?
  2. 什么是可用的验证类型?
  3. 有什么建议的方法来改变ValidationType在此scenari

CODE:

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> 

控制器:

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); 
    } 

    } 

} 

阅读:

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

+0

您刚刚更改了'rule.ValidationType =“更新日期”;还是您更改了JavaScript代码以匹配它? – 2012-02-19 14:27:03

+0

我在三个地方改变了它。 1)rule.ValidationType =“更新”2)在Javascript中注册适配器。 3)在javascript – Lijo 2012-02-19 14:34:14

+0

中的addmethod我已经添加了控制器代码,以便您可以自己尝试,以查看错误。 – Lijo 2012-02-19 14:53:17

回答

8

我想把它变成别的东西,如 “anotherDefaultType”

您可以使用该ValidationType属性只有小写字母:

rule.ValidationType = "anotherdefaulttype"; 

和然后修改您的客户端脚本以反映此修改:

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

知情者感谢:) – Rajpurohit 2013-12-25 09:59:47