Санитарная обработка параметров в ASP.Net Core 2.2 - PullRequest
0 голосов
/ 30 декабря 2018

У меня, казалось бы, довольно специфическая проблема.Мой контроллер верхнего уровня и модели для сложных параметров генерируются автоматически (Nswag).Часть модели состоит из перечислений.У меня есть параметры (в запросе или теле), которые должны содержать обратную косую черту.Их значения в автоматически сгенерированных перечислениях автоматически заменяются обратными слешами на подчеркивания.Чтобы проверка модели работала, мне нужно как-то перехватить привязку параметров с этими перечислениями и изменить их до того, как, следовательно, будет привязка.

Например, с учетом запроса

?param=A\B

(или тело с param="a\b") и Enum:

public enum SomeEnum
{
  [System.Runtime.Serialization.EnumMember(Value = @"A\B")]
  A_B = 0
}

Проверка модели не удалась, потому что A\B, естественно, не найден в перечислении.

Я пробовал фильтры, пользовательские привязки моделей и т. Д., И кажется, что наилучшее место - привязка пользовательской модели, поскольку она может быть применена именно в точке привязки этой конкретной модели.Теперь проблема в том, что мне нужно изменить входящий параметр и привязать к измененной версии с подчеркиванием.Я не могу на всю жизнь узнать, как это сделать.Я реализовал собственный класс IModelBinder, который вызывается правильно, но ModelBindingResult.Success(model) не изменяет то, что связано с .

Просто чтобы было ясно, это не имеет ничего общего с кодировкой URL илипривязка к коллекциям и т. д. Это все работает нормально.

Мне необходимо изменить параметры, связанные с конкретным Enum, чтобы они соответствовали автоматически сгенерированным свойствам enum.Любые идеи высоко ценится.

1 Ответ

0 голосов
/ 30 декабря 2018

Кажется, что пользовательское связующее является правильным способом сделать это, когда вы правильно его кодируете ... Ниже приведен класс связующего, который прекрасно работает.SSASPropertyNameBinder - это перечисление, значения которого могут содержать обратную косую черту.Этот класс в основном представляет собой котельную плиту из документации MS ASP.Net Core о пользовательских модельных папках - интересный бит в конце.

public class SSASPropertyNameBinder : IModelBinder
{

    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        var modelName = bindingContext.ModelName;

        // Try to fetch the value of the argument by name
        var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);

        if (valueProviderResult == ValueProviderResult.None)
        {
            return Task.CompletedTask;
        }

        var value = valueProviderResult.FirstValue;

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

        ValueProviderResult newValueProviderResult = new ValueProviderResult(valueProviderResult.FirstValue.Replace(@"\", "_"));
        bindingContext.ModelState.SetModelValue(modelName, newValueProviderResult);
        SSASServerPropertyName spn;

        // Check if a valid SSAS property
        if (Enum.TryParse<SSASServerPropertyName>(newValueProviderResult.FirstValue, out spn))
        {
            bindingContext.Result = ModelBindingResult.Success(spn);
        }
        else
        {
            bindingContext.ModelState.TryAddModelError(modelName, $"Invalid SSAS Property: {valueProviderResult.FirstValue}");
        }

        return Task.CompletedTask;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...