首页 > 解决方案 > 如何在帖子上验证财产

问题描述

我有一个 asp .net mvc 应用程序。对于我的所有其他属性,我使用数据注释来验证属性。但我想要一个自定义验证。我正在网上阅读自定义数据注释验证可能是采用的方法。

按照此处的链接ASP.NET MVC: Custom Validation by DataAnnotation它看起来是一个很好的解决方案。我遇到的唯一问题是如果我的 DBContext 不在控制器中,我该如何访问它。

到目前为止我所拥有的

这是我在控制器中用于获取当前用户和数据库上下文的典型代码。

控制器代码

private ApplicationDbContext _dbContext => HttpContext.GetOwinContext().Get<ApplicationDbContext>();

private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
    get
    {
        return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
    }
    private set
    {
        _userManager = value;
    }
}

视图模型

[HasNoRedemption]
public string code {get; set;}

HasNoRedemption.cs

public class HasNoRedemption : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        //check if user has ever claimed the code, return true is good

    }
}

如果我可以在进行自定义验证方面获得一些帮助,以便我能够检查数据库或提出更好方法的建议。

标签: c#asp.net-mvc

解决方案


1)我不建议使用数据注释属性来实现你的业务逻辑。验证属性应该包含纯函数。验证属性背后的目的是缩小被认为是正确的输入数据的范围。不执行您的应用程序的业务规则

2)如果你真的想做你想做的事(出于好奇),请查看以下说明:https ://andrewlock.net/injecting-services-into-validationattributes-in-asp-net-core/

public class CustomValidationAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(
         object value, ValidationContext validationContext)
    {
        // validationContext.GetService() ... 
    }
}

推荐阅读