在 FluentValidation 中访问 WebApi 2 的路线数据

2024-01-02

我有一个基本的 C# Web Api 2 控制器,它有一个 POST 方法来创建实体

public HttpResponseMessage Post(UserModel userModel){ ... }

还有一个更新模型的 PUT 方法

public HttpResponseMessage Put(int id, UserModel userModel) { ... }

这是用户模型

public class UserModel
{
    public virtual Name { get; set; }
    public virtual Username { get; set; }
}

对于我的验证器,我想验证该名称没有在 Post 上使用 - 很简单。对于 PUT,我需要验证该名称未被其他用户占用,但当然这个特定用户将具有相同的用户名。

public class UserModelValidator : AbstractValidator<UserModel>
{
    public UserModelValidator()
    {
        RuleFor(user => user.Username)
            .Must(NotDuplicateName).WithMessage("The username is taken");

    }

    private bool NotDuplicateName(string username)
    {
        var isValid = false;

        //Access repository and check to see if username is not in use
        //If it is in use by this user, then it is ok - but user ID is
        //in the route parameter and not in the model.  How do I access?

        return isValid;
    }
}

我正在使用 AutoFac,所以也许有一种方法可以将 HttpRequest 注入验证器并以这种方式获取路由数据。

或者我可以创建一个模型绑定器来查找路线数据并将其添加到模型中?

或者有一个简单的方法吗?


我找到了另一种解决方案,注入IActionContextAccessor进入验证器。这样我就可以访问 ROUTE 参数,而不需要特殊的模型绑定。

启动.cs

services.AddHttpContextAccessor();
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();

用户模型验证器.cs

public class UserModelValidator : AbstractValidator<UserModel>
{
    public UserModelValidator(IActionContextAccessor actionContextAccessor)
    {
        RuleFor(item => item.Username)
            .MustAsync(async (context, username, propertyValidatorContext, cancellationToken) =>
            {
                var userId = (string)actionContextAccessor.ActionContext.RouteData.Values
                .Where(o => o.Key == "userId")
                .Select(o => o.Value)
                .FirstOrDefault();

                return true;
            });
    }
}

2022 年更新 / FluentValidation 11

从 FluentValidation 11.0 开始,包含异步规则的验证器现在将抛出 AsyncValidatorInvokedSynchronouslyException

https://docs.fluidation.net/en/latest/upgrading-to-11.html#sync-over-async-now-throws-an-exception https://docs.fluentvalidation.net/en/latest/upgrading-to-11.html#sync-over-async-now-throws-an-exception

用户模型验证器.cs

public class UserModelValidator : AbstractValidator<UserModel>
{
    public UserModelValidator(IActionContextAccessor actionContextAccessor)
    {
        RuleFor(item => item.Username)
            .Must((context, username, propertyValidatorContext) =>
            {
                var userId = (string)actionContextAccessor.ActionContext.RouteData.Values
                .GetValueOrDefault("userId");

                return true;
            });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 FluentValidation 中访问 WebApi 2 的路线数据 的相关文章

随机推荐

  • 分组时覆盖箱线图中的下限、上限等

    默认情况下 对于下 中和上分位数geom boxplot考虑 25 50 和 75 分位数 这些是从计算得出的y 但可以通过美学参数手动设置lower upper middle 还提供x ymin and ymax和设置stat ident
  • 如何在 jUnit 测试用例中闯入调试器?

    我正在一个大型 java 项目中调试单元测试 我需要运行 ant test 来启动测试套件 所以我很难从 IDE 启动它 如果它附加到任何调试器 是否可以调用 C 中的 Debugger Break 之类的函数来中断调试器 如果我正确理解你
  • 子字符串并返回特定字符后的值

    测试 BSMain 文本 起始页 我想对上面的值进行子串并只返回后面的值 在 VB NET 中 我怎样才能做到这一点 假设没有错误检查 Dim phrase As String Testing BSMain Text Start Page
  • c fscanf 错误检查

    我正在使用 fscanf 从 C 中的文件中读取 我只是想知道我是否正确检查了所有错误条件 这是最可靠的方法 而且我没有遗漏任何内容 FILE fp char filename untitled int count char item1 1
  • Rust 中单元类型的用途是什么?

    铁锈具有单位类型 具有单个零大小值的类型 该单位类型的值也可以使用指定 单位类型及其值的目的是什么 这是一种避免使用的机制吗null or nil 像其他语言一样 是类型的值 它的目的就是无用 Rust 中的一切都是一个表达式 返回 not
  • Zip 文件上传到服务器时损坏

    我的 java 程序将 zip 文件从我的系统上传到 FTP 服务器 uploadfile 是一个包含上传代码的函数 uploadfile 192 168 0 210 muruganp vm4snk home Admin GATE521 L
  • 全日历结束日期错误一天

    我正在制作一个完整的日历支持的汽车预订功能 这是咖啡脚本文件 updateEvent event delta revertFunc gt ajax type PUT dataType json success data gt alert S
  • 声谱图

    我制作了一个应用程序 可以将 FFT 实时绘制到屏幕上 从麦克风 x 轴上的时间 y 轴上的频率和像素的颜色代表幅度 几乎是一个普通的 FFT 频谱图 我的问题是 即使我可以从音乐中看到模式 但也有很多噪音 谷歌搜索我看到人们对振幅应用对数
  • FacesConverter forClass 不适用于复合组件

    我有一个简单的复合组件 它必须呈现输入文本 当输入值并按下命令按钮时 会引发以下异常 java lang IllegalArgumentException Cannot convert 1 of type class java lang S
  • 谷歌翻译:超出配额

    我正在尝试使用 Google Translate REST API 并同时请求以下网址 我收到以下回复 响应 responseData null responseDetails 超出配额 请参见http code google com ap
  • 在 R 数据框中的所有列中搜索值

    这是一个示例数据框 df data frame company c a b c d bond c 0 2 1 0 3 0 equity c 0 7 0 0 5 1 cash c 0 1 0 0 2 0 df company bond equ
  • javascript 中的 obj.length === +obj.length

    在 underscore js 源码中我在很多地方都遇到过 if obj length obj length 有人可以解释一下 他们为什么使用它 这是另一种写作方式if typeof obj length number 他们为什么这样做 谁
  • iPad 上的 Skrollr 截止

    我正在使用 Skrollr 插件 它在桌面上运行良好 但在 iPad 上 我的文档的高度被截断了 我尝试删除所有 skrollr 数据属性 但问题仍然存在 我注意到只需激活插件就会遇到此问题 我尝试启用 禁用forceHeight选项 但问
  • 未找到 Ansible 内部脚本命令

    Ansible name Node package manager npm name pm2 global yes notify restart nginx name start the app script files common pm
  • 通过反射获取命名空间中的所有类型

    C 中如何通过反射获取命名空间中的所有类 以下代码打印指定的类的名称namespace在当前程序集中定义 正如其他人指出的那样 命名空间可以分散在不同的模块之间 因此您需要首先获取程序集列表 string nspace var q from
  • 异步/等待 JQuery 文档就绪

    它适用于document addEventListener DOMContentLoaded async gt 但我很好奇让它与 JQuery 一起工作 而且 我想要使用异步 等待 不承诺因为稍后我将需要承诺回调之外的变量 let prod
  • PHP,JavaScript - 通过重定向标头来检测屏幕宽度是否正确

    我使用以下 JavaScript 来检测屏幕宽度 并通过条件语句将其用作模板文件中的常量 以显示 不显示网站的部分 虽然它与我的问题没有太大关系 但以防万一 是的 我正在使用 WordPress 我也已经在使用 mobileDetect P
  • Visual Studio 2010 错误:类型 Universe 无法解析程序集

    我已将最初在 Visual Studio 2008 中创建的 WPF 项目加载到 Visual Studio 2010 中 转换过程进展顺利 但在某些 XAML 文件上 VS2010 设计器会抛出几个与项目引用相关的错误 包括以下错误 Sy
  • 如何克服winform的Control.DrawToBitmap()方法大尺寸限制

    我正在使用 C Winforms 和 MS Visual Studio 2010 开发一个桌面应用程序 在该应用程序中 我必须截取表单面板的屏幕截图并将图像保存在光盘中 面板尺寸可以很大 我使用了 Panel DrawToBitmap 方法
  • 在 FluentValidation 中访问 WebApi 2 的路线数据

    我有一个基本的 C Web Api 2 控制器 它有一个 POST 方法来创建实体 public HttpResponseMessage Post UserModel userModel 还有一个更新模型的 PUT 方法 public Ht