我需要在模型中获取ApplicationDbContext。
我正在创建ValidationAttribute。该验证将检查数据库中的某些记录,并在必要时生成错误。
public class MyModel
{
public int? ID { get; set; }
[MyValidationForName]
public string Name { get; set; }
}
public class MyValidationForName : ValidationAttribute
{
protected ValidationResult IsValid(object value, ValidationContext validationContext)
{
/* code here */
return new ValidationResult("This field contains an error");
}
}
以上示例在保存记录时会生成错误(DataAnnotation)。只能检查日期,长度等。
但是我必须查询数据库中的一些记录。为此,不能将数据库上下文传递给模型。
我读过的所有SO主题都说明了如何使用Remote和JS进行验证,并将验证放在Controller上。我不要这个。
最相关的SO主题是:Using DB Context in a Custom Validation Attribute(通过添加上下文,它仍然不起作用)
有人可以帮助我将ApplicationDbContext传递给模型以执行查询并使用ValidationAttribute对其进行验证吗?
答案 0 :(得分:1)
即使在堆栈溢出时,我也从未找到答案。但是几天后,我得到了解决方案。所以,我在下面回答,希望对您有所帮助。
首先,在模型类中添加using System.Linq;
。
因此,请应用上下文:
var _context = (ApplicationDbContext)validationContext.GetService(typeof(ApplicationDbContext));
现在,我们可以在ValidationAttribute中执行查询了。
完整示例:
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq;
public class MyModel
{
public int? ID { get; set; }
[Required(ErrorMessage = "Name can not be blank")]
[ExampleValidation]
public string Name { get; set; }
}
public class ExampleValidation : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var _context = (ApplicationDbContext)validationContext
.GetService(typeof(ApplicationDbContext));
/* my query here using the _context, and if necessary, apply the error message below: */
return new ValidationResult("My error message here");
}
}
}