2014-10-14 4 views
10

У меня есть метод 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 для булевых?

Редактировать: Пример, который я представил, намеренно упрощен. У меня много моделей ввода в моем приложении, и они содержат много логических полей, которые я бы хотел обработать описанным выше способом. Если бы было только одно поле, я бы не стал прибегать к таким сложным механизмам.

+0

У меня есть обходное решение, создайте свойство readonly, произнесите 'IsAwesome1' в' SampleInput' и сделайте 'IsAwesome' как строку, установите' IsAwesome1' = true, только если 'IsAwesome' = '" 1 "или' true "' –

+0

@ArindamNayak В моем примере просто слишком много полей, таких как тот, который раздувает код. Я думал, что есть более элегантный способ сделать это в Web API.На данный момент я возвращаюсь к MVC; У меня есть «IModelBinder», который хорошо выполняет работу ». – GolfWolf

ответ

4

Похоже, что декорирование параметра FromUriAttribute просто пропускает правила привязки параметров. Я сделал простой тест, заменяющий параметр SampleInput ввода с помощью простого bool:

public string Get([FromUri] bool IsAwesome) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

и логическое правило еще не вызывался (IsAwesome приходит в null, когда вы звоните &isAwesome=1). Как только вы удалите атрибут FromUri:

public string Get(bool IsAwesome) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

правило вызывается и параметр правильно связан. Класс FromUriAttribute запечатан, поэтому я думаю, что вы довольно сильно ввернуты - ну, вы всегда можете переопределить его и включить свою альтернативную логическую логику привязки^_ ^.

Смежные вопросы