ASP.NET MVC5中的服务端验证是如何实现的?

ASP.NET MVC5验证系列之服务端验证

ASP.NET MVC5中的服务端验证是如何实现的?

在ASP.NET MVC5中,服务端验证是一项至关重要的功能,用于确保用户提交的数据在接收和处理前符合预期的格式和规则,本文将详细介绍如何通过手动验证和使用数据注解API进行服务端验证。

一、服务端验证的必要性

服务端验证是必要的,因为它可以在服务器上执行更复杂、更安全的验证逻辑,防止恶意用户绕过客户端验证,ASP.NET MVC框架在处理HTTP POST请求时,会自动对传入控制器的方法参数进行验证,如果验证失败,框架会将错误信息存储在ModelState对象中,这个对象随后会被传递给控制器方法。

二、手动验证

手动验证是通过检查模型(Model)属性并直接在ModelState中添加错误消息来实现的,在Student控制器的Index方法中,如果检测到Student模型的Name属性为空,我们可以这样做:

if (string.IsNullOrEmpty(model.Name)) {
    ModelState.AddModelError("Name", "姓名不能为空");
}

这样,当Name为空时,会在ModelState中添加一个错误消息,控制器方法可以通过检查ModelState.IsValid来判断验证是否成功。

三、数据注解API的使用

ASP.NET MVC5中的服务端验证是如何实现的?

数据注解是一种声明式的方式,可以在模型类或属性上定义验证规则,我们可以为Student的Email属性添加验证规则,确保它是有效的电子邮件地址:

public class Student {
    public string Name { get; set; }
    [Required]
    [EmailAddress(ErrorMessage = "请输入有效的电子邮件地址")]
    public string Email { get; set; }
}

在上面的例子中,[Required]注解确保Email字段不为空,[EmailAddress]注解则检查输入是否符合电子邮件格式,如果输入不符合这些规则,ASP.NET MVC会自动在ModelState中添加相应的错误消息。

在控制器中,我们不再需要手动检查Email字段的验证,因为框架会自动处理这些注解,我们只需检查ModelState.IsValid,如:

[HttpPost]
public ActionResult Index(Student model) {
    if (!ModelState.IsValid) {
        return View(model);
    }
    // 验证通过,可以继续执行业务逻辑
}

通过这种方式,我们可以轻松地添加和管理验证规则,同时保持控制器代码简洁,数据注解API提供了丰富的验证特性,如[StringLength]用于限制字符串长度,[Range]用于指定数值范围,以及自定义验证特性等。

四、自定义验证

除了内置的数据注解外,还可以创建自定义验证特性,为了验证学生的年龄是否在18到25岁之间,可以创建一个AgeRangeAttribute:

public class AgeRangeAttribute : RangeAttribute, IClientValidatable
{
    public AgeRangeAttribute(int minimum, int maximum) : base(minimum, maximum) { }
    
    public override bool IsValid(object value) {
        DateTime birthDate = (DateTime)value;
        DateTime age = new DateTime(DateTime.Now.Ticks birthDate.Ticks);
        return age.Year >= (int)this.Minimum && age.Year <= (int)this.Maximum;
    }
    
    public override string FormatErrorMessage(string name) {
        return base.FormatErrorMessage("年龄");
    }
    
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
        ModelClientValidationRule validationRule = new ModelClientValidationRule(){ ValidationType = "agerange", ErrorMessage= FormatErrorMessage(metadata.DisplayName)};
        validationRule.ValidationParameters.Add("currentdate",DateTime.Today.ToString("dd-MM-yyyy"));
        validationRule.ValidationParameters.Add("minage",this.Minimum);
        validationRule.ValidationParameters.Add("maxage",this.Maximum);
        yield return validationRule;
    }
}

然后将其应用于模型属性:

ASP.NET MVC5中的服务端验证是如何实现的?

public class Student {
    public string Name { get; set; }
    [AgeRange(18, 25)]
    public DateTime DateOfBirth { get; set; }
}

五、注册客户端验证方法

由于ASP.NET MVC采用JQuery Validation进行客户端验证,我们需要通过如下的这段javascript来注册用于实现客户端验证的function和添加相应的adapter:

jQuery.validator.addMethod("agerange", function (value, element, params) {
    var minAge = params.minage;
    var maxAge = params.maxage;
    var literalCurrentDate = params.currentdate;
    var literalBirthDate = value;
    var literalCurrentDates = literalCurrentDate.split('-');
    var literalBirthDates = literalBirthDate.split('-');
    var birthDate = new Date(literalBirthDates[2], literalBirthDates[1], literalBirthDates[0]);
    var currentDate = new Date(literalCurrentDates[2], literalCurrentDates[1], literalCurrentDates[0]);
    var age = currentDate.getFullYear() birthDate.getFullYear();
    return age >= minAge && age <= maxAge;
});
jQuery.validator.unobtrusive.adapters.addSingleVal("agerange", "agerange");

六、归纳

ASP.NET MVC5的服务端验证结合了手动验证和数据注解API,提供了一种灵活而强大的方式来确保用户输入的数据符合预期,这不仅可以提高应用的安全性,还可以提升用户体验,因为错误信息可以在用户提交表单后立即显示,通过熟练掌握这两种验证方法,开发者可以构建出更加健壮和安全的ASP.NET MVC应用程序。

以上就是关于“ASP.NET MVC5验证系列之服务端验证”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!