3

我最近开始使用 ASP.NET Boilerplate 作为我正在处理的项目的起点 - Asp.NET Core Web Api + Angular,但我无法找到一些在我看来很常见的信息使用问题。我会尽力解释我的意思。

我想要做的是有一个 API 端点,它接受一个需要限制为一组特定值的参数 - 所以,我想为此目的使用 Enum。

就参数验证而言,这一切都很好,但我很困惑如何使这与 Nswag 为 fontend 的 swagger 和共享代理生成的服务一起工作。

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

让我们使用这样的示例,在应用服务方法之一中使用的用户输入:

服务方式:

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 用于有助于文档的大摇大摆生成选项,但它在 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 中正确显示,并且在重新生成共享代理时不会破坏 angular 项目中的任何内容使用 Nswag 工具?

4

2 回答 2

1

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

services
    .AddMvc(options => options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName)))
    .AddJsonOptions(options => options.SerializerSettings.Converters.Add(new StringEnumConverter()));
于 2019-04-05T16:50:53.603 回答
0

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

有一天我遇到了同样的问题,我有一个性别枚举,我想显示 NSwag 生成的内容MaleFemale不是 0 和 1,为了解决这个问题 在 Angular 模板中,我在静态类中创建了一个数组,就像后端枚举的副本,这样就可以加载一个选择。

这里的例子

后端枚举

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

Nswag 生成 Angular 后的枚举。

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

}

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

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

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

                                    <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.sexo中是类型EstudianteDtoSexo

我希望这可以帮助你。

于 2018-12-18T19:54:04.283 回答