MVC3 中的 Attribute 、Validation

运用系统自定义的 Attribute [xxxxxx] ,也可以说是 DataAnnotation 配置方式

1. 当出现同名方法,不能编译时,可以通过设置[Action("方法名")]后,重新定义“方法名”的别名,如下,红色部份是不能编译的,

[HttpGet]

public ActionResult Submit(int id)

{

       return View();

}

[HttpPost]

public ActionResult Submit(int id)

{

       return View();

}

----------------------------------------------------->

正确编译

[HttpGet]

public ActionResult Submit(int id)

{

     return View();

}

[HttpPost]

[ActionName("Submit")] // 在视图中,还是使用Submit,不能用SubmitByPost

public ActionResult SubmitByPost(int id)

{

      return View();

} 

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

public class PersonModel

{

  //未对其任何属性进行设置

  [Required]

  public string Name{get;set;}

  //更改默认EorrorMessage属性值,如下设置:

  [Required(ErrorMessage="Age is required, Age>=16 and Age <100.")]

  public int Age{get;set;}

}

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

服务端验证,当运用ModelState.IsValid时,其[xxxxxx]的IsValid(...)都会被调用,并将其结果载入 ModelState["xxxxxx"].Errors 中

在Models中的,可以自定义特性来验证属性:

public class NumericalAttribute : ValidationAttribute ,IClientValidatable

{

  protected override ValidationResult IsValid(object value, ValidationContext validationContext)
      {

    int num=-1;
            if(int.TryParse(value.ToString(),out num))

      {return ValidationResult.Success;}

  
            else{ return new ValidationResult("value is not numerical."); }
            
      }

  

 public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
   {
        yield return new ModelClientValidationRule
        {        
            ErrorMessage = ErrorMessage,
            ValidationType = "numerical" // xxxxxx 必须全小写
        };
   }

}

 

需要在客户端验证时,则 xxxxxxAttribute 必须实现 IClientValidatable 接口,在前端页面加载如下JS:

 

 <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
 <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>
 

$(document).ready(function(){

  //以下 'numerical'也必须是全小写,并且与 xxxxxx 同名
    jQuery.validator.addMethod('numerical', function(value, element, param) {
               return !isNaN(Number(value));
    }, '');

  jQuery.validator.unobtrusive.adapters.add('numerical', {}, function (options) {
        options.rules['numerical'] = true;
        options.messages['numerical'] = options.message;
    });
}); 

在web.config中启动全局的

 <appSettings>
    <add key="ClientValidationEnabled" value="true"/>
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/>  //会在对应的标签生成属性 data-val-xxxxxx
 </appSettings>

,其中 ClientValidationEnabled 和 UnobtrusiveJavaScriptEnabled 也可以在某个 View 中设置,那么当前View则不会客户端验证

@{

  HtmlHelper.ClientValidationEnable=false;

}

在Models中,则可以这样使用 

public class Project

{

  [Numerical]

  public int Age{get;set;}

}

 在View 中显示错误信息的方式

@Html.ValidationSummary() 所有错误信息汇总在一个区域

@Html.ValidationMessageFor(model => model.Name)单独显示错误信息,通常紧贴在对应标签

posted @ 2012-04-06 19:13  Yu  阅读(241)  评论(0编辑  收藏  举报