我最近开始使用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工具?
我的英语不是很好,但我会尽力说清楚。
我有一天同样的问题我有一个性别的枚举我想要显示Male
和Female
而不是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.sexo
是EstudianteDtoSexo
类型
我希望这可以帮到你。
我相信你需要将StringEnumConverter添加到SerializerSettings而不是DescribeAllEnumsAsStrings()
。换句话说,在Startup.cs中的ConfigureServices()中你应该有这样的东西:
services
.AddMvc(options => options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName)))
.AddJsonOptions(options => options.SerializerSettings.Converters.Add(new StringEnumConverter()));