ASP.NET Boilerplate:将用户输入DTO属性值约束到特定的值集

问题描述 投票:2回答:2

我最近开始使用ASP.NET Boilerplate作为我正在研究的项目的起点 - Asp.NET Core Web Api + Angular,我很难找到一些关于某些东西的信息,这些信息在我看来就像一个普通的使用问题。我会尽力解释我的意思。

我想要做的是拥有一个API端点,该端点需要将参数限制为一组特定的值 - 因此,我想将Enum用于此目的。

就参数验证而言,这一切都很好用,但我很困惑如何通过Nswag为swonger和共享代理生成的服务提供良好的工作。

枚举参数在文档参数示例中显示为整数,因此仅通过查看swagger文档的可用值集合并不清楚,因为int值对于查看文档的用户没有意义。

让我们使用这样一个例子,在一个app服务方法中使用的用户输入:

服务方式:

public async Task DoSomething(SomethingInput input)
{
    //some code handling user input
}

输入DTO:

public class SomethingInput : EntityDto<string>
{
    [EnumDataType(typeof(SomethingEnum))]
    public SomethingEnum Something { get; set; }

    public int SomeOtherData { get; set; }
}

枚举:

public enum SomethingEnum
{
    Option1,
    Option2,
    Option3
}

在这种情况下,SomethingInput中SomethingEnum的可用值将显示为0,1,3,而不是“Option1”,“Option2”,“Option2”。

我尝试将DescribeAllEnumsAsStrings用于swagger生成选项,这有助于文档,但它在Angular项目功能中产生了一个问题 - 具体而言,由于使用Nswag工具使用DescribeAllEnumsAsStrings生成枚举的方式,更改租户失败 - 它期望值为整数,而不是字符串。

export enum IsTenantAvailableOutputState {
    Available = <any>"Available", 
    InActive = <any>"InActive", 
    NotFound = <any>"NotFound", 
}

API返回的响应值是数字,此代码不知道如何正确解析值,因为枚举不再具有整数值:

export class AppTenantAvailabilityState {
    static Available: number = IsTenantAvailableOutputState._1;
    static InActive: number = IsTenantAvailableOutputState._2;
    static NotFound: number = IsTenantAvailableOutputState._3;
}

这里的问题是,在路由或DTO对象中使用这些约束参数作为用户输入的最佳实践是什么,以便它们在swagger doc中正确显示,并且在重新生成共享代理时不会分解角度项目中的任何内容用Nswag工具?

swagger aspnetboilerplate asp.net-boilerplate nswag
2个回答
0
投票

我的英语不是很好,但我会尽力说清楚。

我有一天同样的问题我有一个性别的枚举我想要显示MaleFemale而不是0和1什么是NSwag生成,解决这个问题在Angular模板中我在静态类中创建了一个类似于副本的数组后端枚举,并由此能够加载选择。

这里的例子

枚举在后端

public enum Sexo
{
    [Description("Masculino")]
    M,
    [Description("Fenemino")]
    F
}

在Nswag生成它之后,角度为Enum。

export enum EstudianteDtoSexo {
_0 = 0, 
_1 = 1, 

}

角度数组(这是我解决问题的方法)

export class SexoArray {
static Sexo =  [
    { value: 0, name: 'Masculino' },
    { value: 1, name: 'Femenino'}
];

然后我填充一个ng-select与SexoArray的元素绑定它像这样

                                    <div [ngClass]="(nombres.invalid && nombres.touched)?' form-group mb-4 has-error ':' form-group mb-4'">
                                    <label class="col-form-label">{{l("Sexo")}}<span class="text-danger"> *</span> </label>                            
                                    <ng-select 
                                        [(ngModel)]="estudiante.sexo" 
                                        name= "sexoSelect" 
                                        #sexoModel = "ngModel" 
                                        required>
                                        <ng-option *ngFor="let sex of sexo" [value]="sex.value">{{sex.name}}</ng-option>
                                    </ng-select>
                                    <app-input-validation [input]="sexoModel"></app-input-validation>
                                </div>

在这个例子中,estudiante.sexoEstudianteDtoSexo类型

我希望这可以帮到你。


0
投票

我相信你需要将StringEnumConverter添加到SerializerSettings而不是DescribeAllEnumsAsStrings()。换句话说,在Startup.cs中的ConfigureServices()中你应该有这样的东西:

services
    .AddMvc(options => options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName)))
    .AddJsonOptions(options => options.SerializerSettings.Converters.Add(new StringEnumConverter()));
© www.soinside.com 2019 - 2024. All rights reserved.