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)单独显示错误信息,通常紧贴在对应标签