У меня есть метод WebAPI, как этот:Пользовательские Boolean Параметр Переплет
public string Get([FromUri] SampleInput input)
{
//do stuff with the input...
return "ok";
}
Вход определяется следующим образом:
public class SampleInput
{
// ...other fields
public bool IsAwesome { get; set; }
}
Как это, он хорошо работает: если я прохожу &isAwesome=true
в строке запроса параметр инициализируется значением true
.
Моя проблема в том, что я хотел бы принять как &isAwesome=true
, так и &isAwesome=1
как true
значений. В настоящее время вторая версия приведет к тому, что IsAwesome
будет false
во входной модели.
То, что я пробовал, после прочтения различных сообщений в блоге на эту тему, было определение HttpParameterBinding
:
public class BooleanNumericParameterBinding : HttpParameterBinding
{
private static readonly HashSet<string> TrueValues =
new HashSet<string>(new[] { "true", "1" }, StringComparer.InvariantCultureIgnoreCase);
public BooleanNumericParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor)
{
}
public override Task ExecuteBindingAsync(
ModelMetadataProvider metadataProvider,
HttpActionContext actionContext,
CancellationToken cancellationToken)
{
var routeValues = actionContext.ControllerContext.RouteData.Values;
var value = (routeValues[Descriptor.ParameterName] ?? 0).ToString();
return Task.FromResult(TrueValues.Contains(value));
}
}
... и зарегистрировать его в Global.asax.cs, используя :
var pb = GlobalConfiguration.Configuration.ParameterBindingRules;
pb.Add(typeof(bool), p => new BooleanNumericParameterBinding(p));
и
var pb = GlobalConfiguration.Configuration.ParameterBindingRules;
pb.Insert(0, typeof(bool), p => new BooleanNumericParameterBinding(p));
Ничего из этого не получилось. Мой обычай HttpParameterBinding
не вызывается, и я все еще получаю значение 1
, переведенное на false
.
Как настроить WebAPI для принятия значения 1
как true
для булевых?
Редактировать: Пример, который я представил, намеренно упрощен. У меня много моделей ввода в моем приложении, и они содержат много логических полей, которые я бы хотел обработать описанным выше способом. Если бы было только одно поле, я бы не стал прибегать к таким сложным механизмам.
У меня есть обходное решение, создайте свойство readonly, произнесите 'IsAwesome1' в' SampleInput' и сделайте 'IsAwesome' как строку, установите' IsAwesome1' = true, только если 'IsAwesome' = '" 1 "или' true "' –
@ArindamNayak В моем примере просто слишком много полей, таких как тот, который раздувает код. Я думал, что есть более элегантный способ сделать это в Web API.На данный момент я возвращаюсь к MVC; У меня есть «IModelBinder», который хорошо выполняет работу ». – GolfWolf