ASP.NET Boilerplate: ограничение ввода пользователем значения свойства DTO для определенного набора значений - PullRequest
0 голосов
/ 18 декабря 2018

Я недавно начал использовать ASP.NET Boilerplate в качестве отправной точки для проекта, над которым я работаю - Asp.NET Core Web Api + Angular, и у меня возникают проблемы с поиском некоторой информации относительно того, что мне кажетсякак проблема общего пользования.Я постараюсь объяснить, что я имею в виду, как могу.

Я хочу иметь конечную точку API, которая принимает параметр, который должен быть ограничен определенным набором значений - поэтому яхотел использовать Enum для этой цели.

Это все хорошо работает, когда идет проверка параметров, но я не совсем понимаю, как сделать так, чтобы это работало хорошо с сервисами, генерируемыми swagger и прокси-сервером общего доступа для шрифта Nswag.

Параметр Enum isотображается как целое число в примере параметра документации, поэтому не ясно, просто взглянув на документацию 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; }
}

Enum:

public enum SomethingEnum
{
    Option1,
    Option2,
    Option3
}

В этом случае доступные значения SomethingEnum в SomethingInput будут отображаться как 0, 1, 3 вместо «Option1», «Option2», «Option2».

Я пыталсяиспользование DescribeAllEnumsAsStrings для параметров генерации чванства, которое помогает с документацией, но создает проблему в функциональности проекта Angular - если быть конкретным, измененоВ этом случае происходит сбой арендатора из-за способа создания перечислений с помощью инструмента DescribeAllEnumsAsStrings с помощью инструмента Nswag - он ожидает, что значения будут целыми числами, а не строками.

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

Значение ответа, возвращаемое API, является числовым, и этот код незнать, как правильно анализировать значение, потому что enum больше не имеет целочисленных значений:

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

Вопрос здесь в том, каков наилучший способ использования таких ограниченных параметров в маршрутах или объектах DTO, используемых в качестве пользователя.входные данные, чтобы они правильно отображались в документах Swagger и ничего не ломали в угловом проекте при регенерации общих прокси с помощью инструмента Nswag?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Я считаю, что вместо DescribeAllEnumsAsStrings() вам нужно добавить StringEnumConverter в SerializerSettings.Другими словами, в ConfigureServices () в Startup.cs у вас должно быть что-то вроде этого:

services
    .AddMvc(options => options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName)))
    .AddJsonOptions(options => options.SerializerSettings.Converters.Add(new StringEnumConverter()));
0 голосов
/ 18 декабря 2018

мой английский не очень хорош, но я постараюсь прояснить ситуацию.

У меня однажды была такая же проблема, у меня есть Enum для пола, и я хотел отобразить Male и Female вместо 0и 1 что генерирует NSwag, чтобы решить этот шаблон В Angular я создал Array в статическом классе, который похож на копию backend enum, и с этим смог загрузить Select.

Примеры здесь

Перечисление в бэкэнде

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

Перечисление в угловых после того, как Nswag генерирует его.

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

Надеюсь, это может помочь вам.

...