ASP.NET MVC--数据验证

数据验证

1,asp.net mvc会自动根据属性的类型进行基本的校验,比如如果属性是int类型的,那么在提交非整数类型的数据的时候就会报错。
注意
ASP.net MVC并不是在请求验证失败的时候抛异常,而是把决定权交给程序员,程序员需要决定如何处理数据校验失败。

在Action中根据ModelState.IsValid判断是否验证通过,如果没有通过下面的方法拿到报错信息
示例代码:

public ActionResult Index(IndexModel model)
{
    if (ModelState.IsValid)
    {
        return Content("Age=" + model.Age);
    }
    else
    {
        return Content("验证失败");
    }
}

在参数很多的情况下使用下面的封装的方法:

public static string GetValidMsg(ModelStateDictionary modelState)
{
    StringBuilder sb = new StringBuilder();
    foreach (var propName in modelState.Keys)
    {
        if (modelState[propName].Errors.Count <= 0)
        {
            continue;
        }
        sb.Append("属性【").Append(propName).Append("】错误:");
        foreach (var modelError in modelState[propName].Errors)
        {
            sb.AppendLine(modelError.ErrorMessage);
        }
    }
    return sb.ToString();
}

Attribute

ASP.Net MVC提供了在服务器端验证请求数据的能力。要把对应的Attribute标记到Model的属性上(标记到方法参数上很多地方不起作用)。

常用验证Attribute:
a) [Required]   这个属性是必须的
b) [StringLength(100)],字符串最大长度100
c) [RegularExpression(@“aa(\d)+bb”)]   正则表达式
d) [Range(35,88)]  数值范围。字符串长度范围的话请使用[StringLength(100,MinimumLength=10)]
e) [Compare(“Email”)]  这个属性必须和Email属性值一样。
f) [EmailAddress]   要是邮箱地址
g) [Phone]  电话号码,规则有限

示例代码:

public class IndexModel
{
    [Required]
    public int Age { get; set; }
    public long Id { get; set; }
    public string Name { get; set; }
    [StringLength(11)]
    public string PhoneNum { get; set; }
}

验证Attribute上都有ErrorMessage属性,用来自定义报错信息。ErrorMessage中可以用{0}占位符作为属性名的占位。 示例代码:

[Required(ErrorMessage="不能为空")]
public int Age { get; set; }    

数据验证+Html辅助类高级控件可以实现很多简化的开发,连客户端+服务器端校验都自动实现了,但是有点太“WebForm”了,因此这里先学习核心原理,避免晕菜。

自定义验证规则

1,使用正则表达式的校验,直接从RegularExpressionAttribute继承 示例代码:

public class QQNumberAttribute : RegularExpressionAttribute
{
    public QQNumberAttribute() : base(@"^\d{5,10}$")//不要忘了^$
    {
        this.ErrorMessage = "{0}属性不是合法的QQ号,QQ号需要5-10位数字";
        //设定ErrorMessage的默认值。使用的人也可以覆盖这个值
    }
}

手机号的正则表达式:@“^1(3[0-9]|4[57]|5[0-35-9]|7[01678]|8[0-9])\d{8}$”

2 直接继承自ValidationAttribute,重写IsValid方法 比如校验中国电话号码合法性

public class CNPhoneNumAttribute : ValidationAttribute
{
    public CNPhoneNumAttribute()
    {
        this.ErrorMessage = "电话号码必须是固话或者手机,固话要是3-4位区号开头,手机必须以13、15、18、17开头";
    }
    public override bool IsValid(object value)
    {
        if (value is string)
        {
            string s = (string)value;
            if (s.Length == 13)//手机号
            {
                if (s.StartsWith("13") || s.StartsWith("15") || s.StartsWith("17") || s.StartsWith("18"))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }
}

3,还可以让Model类实现IValidatableObject接口,用的比较少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sufengmarket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值