Declare multiple variables in JavaScript

Решение ASP.NET Core 2.0 (Swagger Ready)

Вход

DELETE /api/items/1,2
DELETE /api/items/1

Код

Напишите поставщика (как MVC знает, какое связующее использовать)

public class CustomBinderProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(ModelBinderProviderContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        if (context.Metadata.ModelType == typeof(int[]) || context.Metadata.ModelType == typeof(List))
        {
            return new BinderTypeModelBinder(typeof(CommaDelimitedArrayParameterBinder));
        }

        return null;
    }
}

Написать фактическое связующее (получить доступ ко всей информации о запросе, действии, моделях, типах и т. Д.)

public class CommaDelimitedArrayParameterBinder : IModelBinder
{

    public Task BindModelAsync(ModelBindingContext bindingContext)
    {

        var value = bindingContext.ActionContext.RouteData.Values[bindingContext.FieldName] as string;

        // Check if the argument value is null or empty
        if (string.IsNullOrEmpty(value))
        {
            return Task.CompletedTask;
        }

        var ints = value?.Split(',').Select(int.Parse).ToArray();

        bindingContext.Result = ModelBindingResult.Success(ints);

        if(bindingContext.ModelType == typeof(List))
        {
            bindingContext.Result = ModelBindingResult.Success(ints.ToList());
        }

        return Task.CompletedTask;
    }
}

Зарегистрировать его в MVC

services.AddMvc(options =>
{
    // add custom binder to beginning of collection
    options.ModelBinderProviders.Insert(0, new CustomBinderProvider());
});

Пример использования с хорошо документированным контроллером для Swagger

/// 
/// Deletes a list of items.
/// 
/// The list of unique identifiers for the  items.
/// The deleted item.
/// The item was successfully deleted.
/// The item is invalid.
[HttpDelete("{itemIds}", Name = ItemControllerRoute.DeleteItems)]
[ProducesResponseType(typeof(void), StatusCodes.Status204NoContent)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
public async Task Delete(List itemIds)
=> await _itemAppService.RemoveRangeAsync(itemIds);

РЕДАКТИРОВАТЬ: Microsoft рекомендует использовать TypeConverter для этих детей операций по этому подходу. Поэтому следуйте советам, приведенным ниже, и документируйте свой собственный тип с помощью SchemaFilter.

38
задан Peter Mortensen 17 January 2016 в 12:50
поделиться

1 ответ

Во всех отношениях, literal [] синтаксис нотации должен использоваться. Начиная с Конструктор Array неоднозначен в том, как он имеет дело с параметры .

Из документов:

, Если единственный аргумент передал Конструктору Array, целое число между 0 и 232-1 (содержащий), это возвращает новый массив JavaScript с его набором свойств длины к тому числу. И это подразумевает Array из [1 121], передал длину из пустых слотов с [1 122] undefined значения.

new Array(1, 2, 3); // Result: [1, 2, 3]
new Array(3); // Result: [empty × 3] with undefined at indexes
new Array('3') // Result: ['3']

//this was ambiguous
let x = new Array(5); // Result: [empty × 5]
x.push("Hello"); //expected x as ["Hello", empty, empty, empty, empty]
//Actual x: [empty × 5, "Hello"]

синтаксис Destructuring:

Другой более опрятный способ объявить несколько переменных использует destructuring присвоение , который позволяет распаковать значения от массивов или свойства от объектов, в отличные переменные.

function foo() {
  //destructuring assignment syntax
  let [src_arr, caption_arr, fav_arr, hidden_arr] = [[], [], [], []];

  console.info("Variables::", fav_arr, hidden_arr, caption_arr, src_arr);

  fav_arr.push("fav");
  hidden_arr.push("hidden");

  //After adding some values to couple of arrays
  console.info("Variables::", fav_arr, hidden_arr, caption_arr, src_arr);
}

foo();
0
ответ дан 27 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: