答案:ASP.NET Core模型验证通过数据注解、自定义验证属性、IValidatableObject接口和远程验证实现,结合ModelState.IsValid在控制器中验证数据,并在API中返回BadRequest(ModelState)以提供错误详情,同时支持客户端验证以提升用户体验。

ASP.NET Core中的模型验证,简单来说,就是确保你从客户端(比如浏览器)接收到的数据符合你预期的格式和规则。这对于保证数据的完整性、安全性和应用程序的稳定运行至关重要。实现方式多种多样,但核心都是围绕着数据注解(Data Annotations)和自定义验证展开的。
解决方案:
ASP.NET Core提供了强大的模型验证机制,主要通过以下几个步骤实现:
数据注解(Data Annotations): 这是最常用的方式。你可以在你的模型类(通常是ViewModel或DTO)的属性上添加各种注解,例如
[Required]
[StringLength]
[Range]
[EmailAddress]
public class UserViewModel
{
[Required(ErrorMessage = "用户名是必填项")]
[StringLength(50, MinimumLength = 3, ErrorMessage = "用户名长度必须在3到50个字符之间")]
public string Username { get; set; }
[Required(ErrorMessage = "密码是必填项")]
[DataType(DataType.Password)]
public string Password { get; set; }
[EmailAddress(ErrorMessage = "无效的邮箱地址")]
public string Email { get; set; }
[Range(18, 120, ErrorMessage = "年龄必须在18到120之间")]
public int Age { get; set; }
}在Controller中使用ModelState.IsValid
ModelState.IsValid
false
[HttpPost]
public IActionResult Create(UserViewModel model)
{
if (!ModelState.IsValid)
{
// 模型验证失败,将错误信息返回给客户端
return View(model); // 或者返回BadRequest,根据你的API设计
}
// 模型验证成功,执行后续操作(例如保存到数据库)
// ...
return RedirectToAction("Index");
}自定义验证属性: 如果数据注解无法满足你的需求,你可以创建自定义的验证属性。这需要你继承
ValidationAttribute
IsValid
public class CustomValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value == null)
{
return new ValidationResult("值不能为空");
}
string strValue = value.ToString();
if (strValue.Contains("forbiddenWord"))
{
return new ValidationResult("值包含禁用词");
}
return ValidationResult.Success;
}
}
public class MyModel
{
[CustomValidation]
public string MyProperty { get; set; }
}IValidatableObject
IValidatableObject
Validate
public class Product : IValidatableObject
{
public decimal Price { get; set; }
public decimal Discount { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Discount > Price)
{
yield return new ValidationResult("折扣不能大于价格", new[] { "Discount", "Price" });
}
}
}客户端验证: ASP.NET Core 默认支持客户端验证,这意味着验证规则会在客户端(通常是浏览器)执行,从而减少服务器的负载。 客户端验证依赖于jQuery Validate插件。
模型验证失败的原因有很多,最常见的是:
[Required]
[Range]
[StringLength]
[EmailAddress]
为了诊断问题,你可以:
ModelState.IsValid
false
ModelState.Values
在API中使用模型验证与在MVC应用程序中使用模型验证类似,但返回结果的方式略有不同。通常,API会返回一个包含错误信息的JSON响应,而不是一个View。
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
[HttpPost]
public IActionResult Create([FromBody] UserViewModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState); // 返回400 Bad Request,包含错误信息
}
// ...
return CreatedAtAction(nameof(Get), new { id = 1 }, model); // 返回201 Created
}
[HttpGet("{id}")]
public IActionResult Get(int id)
{
return Ok(new { Id = id, Name = "Test" });
}
}在这个例子中,如果模型验证失败,
BadRequest(ModelState)
[FromBody]
UserViewModel
虽然客户端验证可以提高用户体验,但在某些情况下,你可能需要禁用它。例如,你可能需要使用自定义的客户端验证逻辑,或者你可能不希望在客户端暴露验证规则。
你可以通过以下方式禁用客户端验证:
_ViewStart.cshtml
ViewData["ValidateAntiForgeryToken"] = false;
ViewData["ValidateAntiForgeryToken"] = false;
[IgnoreAntiforgeryToken]
需要注意的是,禁用客户端验证会增加服务器的负载,因为所有验证都需要在服务器端执行。 另外,
ValidateAntiForgeryToken
远程验证允许你使用服务器端的代码来验证客户端输入。这对于需要访问数据库或其他外部资源的验证非常有用。例如,你可以使用远程验证来检查用户名是否已存在。
创建Controller Action: 你需要创建一个Controller Action来执行验证逻辑。该Action应该返回一个JSON对象,其中包含一个布尔值,表示验证是否成功。
[AcceptVerbs("Get", "Post")]
public IActionResult VerifyUsername(string username)
{
if (_userService.IsUsernameAvailable(username))
{
return Json(true); // 用户名可用
}
else
{
return Json($"用户名 {username} 已经被使用"); // 用户名不可用
}
}使用[Remote]
[Remote]
public class UserViewModel
{
[Remote(action: "VerifyUsername", controller: "Users")]
[Required(ErrorMessage = "用户名是必填项")]
public string Username { get; set; }
}[Remote]
UsersController
VerifyUsername
Username
VerifyUsername
VerifyUsername
以上就是ASP.NET Core中的模型验证是什么?如何实现?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号