MiniValidation 0.9.1

dotnet add package MiniValidation --version 0.9.1                
NuGet\Install-Package MiniValidation -Version 0.9.1                
这条命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="MiniValidation" Version="0.9.1" />                
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中以引用此包。
paket add MiniValidation --version 0.9.1                
#r "nuget: MiniValidation, 0.9.1"                
#r 指令可以在 F# Interactive 和 Polyglot Notebooks 中使用。将此复制到交互式工具或脚本的源代码中以引用包。
// Install MiniValidation as a Cake Addin
#addin nuget:?package=MiniValidation&version=0.9.1

// Install MiniValidation as a Cake Tool
#tool nuget:?package=MiniValidation&version=0.9.1                

MiniValidation

在 .NET 的 System.ComponentModel.DataAnnotations 命名空间现有功能之上构建的极简验证库。添加了对单行验证调用和带循环检测的递归的支持。

支持符合 .NET Standard 2.0 的运行时。

安装

Nuget

NuGet 安装此库

❯ dotnet add package MiniValidation

ASP.NET Core 6+ 项目

如果要将此安装到 ASP.NET Core 6+ 项目中,建议使用 MinimalApis.Extensions 包,它添加了针对 ASP.NET Core 的扩展,包括用于 .NET 7 应用的验证端点筛选器。

❯ dotnet add package MinimalApis.Extensions

示例用法

验证对象

var widget = new Widget { Name = "" };

var isValid = MiniValidator.TryValidate(widget, out var errors);

class Widget
{
    [Required, MinLength(3)]
    public string Name { get; set; }

    public override string ToString() => Name;
}

使用验证器服务

var widget = new Widget { Name = "" };

// Get your serviceProvider from wherever makes sense
var serviceProvider = ...
var isValid = MiniValidator.TryValidate(widget, serviceProvider, out var errors);

class Widget : IValidatableObject
{
    [Required, MinLength(3)]
    public string Name { get; set; }

    public override string ToString() => Name;

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var disallowedNamesService = validationContext.GetService(typeof(IDisallowedNamesService)) as IDisallowedNamesService;

        if (disallowedNamesService is null)
        {
            throw new InvalidOperationException($"Validation of {nameof(Widget)} requires an {nameof(IDisallowedNamesService)} instance.");
        }

        if (disallowedNamesService.IsDisallowedName(Name))
        {
            yield return new($"Cannot name a widget '{Name}'.", new[] { nameof(Name) });
        }
    }
}

控制台应用程序

using System.ComponentModel.DataAnnotations;
using MiniValidation;

var title = args.Length > 0 ? args[0] : "";

var widgets = new List<Widget>
{
    new Widget { Name = title },
    new WidgetWithCustomValidation { Name = title }
};

foreach (var widget in widgets)
{
    if (!MiniValidator.TryValidate(widget, out var errors))
    {
        Console.WriteLine($"{nameof(Widget)} has errors!");
        foreach (var entry in errors)
        {
            Console.WriteLine($"  {entry.Key}:");
            foreach (var error in entry.Value)
            {
                Console.WriteLine($"  - {error}");
            }
        }
    }
    else
    {
        Console.WriteLine($"{nameof(Widget)} '{widget}' is valid!");
    }
}

class Widget
{
    [Required, MinLength(3)]
    public string Name { get; set; }

    public override string ToString() => Name;
}

class WidgetWithCustomValidation : Widget, IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.Equals(Name, "Widget", StringComparison.OrdinalIgnoreCase))
        {
            yield return new($"Cannot name a widget '{Name}'.", new[] { nameof(Name) });
        }
    }
}
❯ widget.exe
Widget 'widget' is valid!
Widget has errors!
  Name:
  - Cannot name a widget 'widget'.

❯ widget.exe Ok
Widget has errors!
  Name:
  - The field Name must be a string or array type with a minimum length of '3'.
Widget has errors!
  Name:
  - The field Name must be a string or array type with a minimum length of '3'.

❯ widget.exe Widget
Widget 'Widget' is valid!
Widget has errors!
  Name:
  - Cannot name a widget 'Widget'.

❯ widget.exe MiniValidation
Widget 'MiniValidation' is valid!
Widget 'MiniValidation' is valid!

Web 应用程序 (.NET 6)

using System.ComponentModel.DataAnnotations;
using MiniValidation;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World");

app.MapGet("/widgets", () =>
    new[] {
        new Widget { Name = "Shinerizer" },
        new Widget { Name = "Sparklizer" }
    });

app.MapGet("/widgets/{name}", (string name) =>
    new Widget { Name = name });

app.MapPost("/widgets", (Widget widget) =>
    !MiniValidator.TryValidate(widget, out var errors)
        ? Results.ValidationProblem(errors)
        : Results.Created($"/widgets/{widget.Name}", widget));

app.MapPost("/widgets/custom-validation", (WidgetWithCustomValidation widget) =>
    !MiniValidator.TryValidate(widget, out var errors)
        ? Results.ValidationProblem(errors)
        : Results.Created($"/widgets/{widget.Name}", widget));

app.Run();

class Widget
{
    [Required, MinLength(3)]
    public string? Name { get; set; }

    public override string? ToString() => Name;
}

class WidgetWithCustomValidation : Widget, IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.Equals(Name, "Widget", StringComparison.OrdinalIgnoreCase))
        {
            yield return new($"Cannot name a widget '{Name}'.", new[] { nameof(Name) });
        }
    }
}
产品 兼容的和额外的计算目标框架版本。
.NET net5.0 已计算。 net5.0-windows 已计算。 net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。
.NET Core netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET Framework net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解有关 目标框架.NET 标准化 的更多信息。

NuGet 包 (16)

显示depends on MiniValidation 的前5个NuGet包

下载
Indice.AspNetCore

包描述

MinimalApis.Extensions

一组用于处理ASP.NET CoreMinimal APIs的扩展和辅助工具。

MinApiLib.Validation

Minimal API的数据注释验证过滤器

Hive.Abstractions

Hive的基本抽象

Wcz.Layout

包描述

GitHub存储库 (3)

显示depends on MiniValidation 的最流行的3个GitHub存储库

存储库 星级
davidfowl/TodoApi
带有ASP.NET Core Blazor WASM、Minimal APIs和身份验证的待办事项应用程序
exceptionless/Exceptionless
Exceptionless应用程序
DamianEdwards/MinimalApis.Extensions
一组用于处理ASP.NET CoreMinimal APIs的扩展和辅助工具。
版本 下载 最后更新
0.9.1 33,990 4/22/2024
0.9.0 116,476 10/15/2023
0.8.0 183,784 6/22/2023
0.7.4 61,172 3/17/2023
0.7.3 1,117 3/14/2023
0.7.2 46,218 12/21/2022
0.7.1 1,098 12/20/2022
0.7.0 18,991 11/29/2022
0.6.0-pre.20220527.55 64,559 5/27/2022
0.5.1-pre.20220429.53 6,415 4/29/2022
0.5.0-pre.20220315.50 18,872 3/15/2022
0.4.2-pre.20220306.48 2,075 3/6/2022
0.4.1-pre.20220107.41 9,442 1/7/2022
0.4.0-pre.20211110.38 22,681 11/10/2021
0.3.0-pre.20210927201159.35 2,253 9/27/2021
0.2.0-pre.20210920234953.30 1,892 9/20/2021