📜  ASP.NET MVC-验证(1)

📅  最后修改于: 2023-12-03 15:13:32.124000             🧑  作者: Mango

ASP.NET MVC 验证

在 ASP.NET MVC 中,验证机制是非常重要的。验证可以确保输入的数据是有效和合法的,从而保证系统安全和正确性。ASP.NET MVC 提供了多种验证的方式,可以满足不同的业务需求。

验证方式

ASP.NET MVC 提供了以下几种验证方式:

  • 属性验证:使用属性注释来标识验证规则,在模型绑定时自动进行验证。
  • 模型验证:在控制器中手动进行验证,检查模型对象的属性是否符合规则。
  • 客户端验证:将验证规则通过 JavaScript 代码添加到客户端,通过 AJAX 请求实现实时验证。
  • 自定义验证:通过编写验证器类实现自定义验证规则。
属性验证

属性验证是 ASP.NET MVC 的默认验证方式,也是最为常用的方式。它通过属性注释来标识验证规则,可以方便地进行开发和维护。

在模型类中,可以通过 System.ComponentModel.DataAnnotations 命名空间中的注释来标识验证规则。例如,下面的代码使用 Required 注释标识 Name 属性不能为空。

public class Product
{
    [Required]
    public string Name { get; set; }
    
    public string Description { get; set; }
}

ASP.NET MVC 会在模型绑定时自动进行属性验证。如果验证失败,会自动将错误信息添加到 ModelState 对象中,方便在视图中显示错误信息。

[HttpPost]
public ActionResult Create(Product product)
{
    if (ModelState.IsValid)
    {
        // 保存数据
        return RedirectToAction("Index");
    }
    else
    {
        // 显示错误信息
        return View(product);
    }
}
模型验证

属性验证只能验证单个属性,如果需要对多个属性进行验证,就需要使用模型验证。模型验证在控制器中手动进行,可以使用 TryValidateModel()ValidateModel() 方法进行验证。例如,下面的代码使用 ValidateModel() 方法验证 Product 对象的所有属性是否符合规则。

[HttpPost]
public ActionResult Create(Product product)
{
    if (ModelState.IsValid)
    {
        if (ValidateModel(product))
        {
            // 保存数据
            return RedirectToAction("Index");
        }
    }
    // 显示错误信息
    return View(product);
}
客户端验证

客户端验证可以在用户输入数据时实时地进行验证,提高用户体验。ASP.NET MVC 提供了多种方式来实现客户端验证,包括使用 jQuery、使用自定义的验证器等。下面的代码使用 jQuery 验证插件来实现客户端验证。

@using (Html.BeginForm())
{
    @Html.TextBoxFor(m => m.Name)
    @Html.ValidationMessageFor(m => m.Name)
    
    @Html.TextBoxFor(m => m.Price)
    @Html.ValidationMessageFor(m => m.Price)
    
    <input type="submit" value="提交" />
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
自定义验证

在某些情况下,需要对特定的数据进行自定义验证,这时可以编写自定义的验证器类来实现。自定义验证器类必须继承 System.ComponentModel.DataAnnotations.ValidationAttribute 类,重写 IsValid() 方法来实现验证逻辑。例如,下面的代码实现了一个验证商品价格是否大于 0 的自定义验证器类。

public class PriceValidator : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value is decimal price && price > 0)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(ErrorMessage ?? "价格必须大于 0");
        }
    }
}

public class Product
{
    public string Name { get; set; }
    
    [PriceValidator]
    public decimal Price { get; set; }
}

自定义验证器类可以与属性验证或模型验证一起使用,例如在模型类中使用自定义验证器:

public class Product
{
    [Required]
    public string Name { get; set; }
    
    [PriceValidator]
    public decimal Price { get; set; }
}
结语

ASP.NET MVC 提供了多种验证方式,可以根据业务需求选择合适的方式进行验证。属性验证是默认的验证方式,对于简单的验证非常方便。模型验证可以实现更复杂的验证逻辑,客户端验证可以提高用户体验,自定义验证器类可以满足更特定的需求。掌握 ASP.NET MVC 的验证机制,可以帮助我们编写更安全可靠的应用程序。