2016-03-04 18 views
7

Ho un modello personalizzato legante, viene utilizzato in un'API REST, che appare come segue:Modelbinder predefinito è 0 quando ritorni null anziché il valore impostato nel controllore

public class CustomQueryModelBinder : IModelBinder 
{ 
    public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext) 
    { 
     if (!String.IsNullOrWhiteSpace(bindingContext.ModelName) && bindingContext.ModelType == typeof(short) && bindingContext.ValueProvider.GetValue(bindingContext.ModelName) != null) 
     { 
      short value; 
      var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).FirstValue as string; 

      if (String.IsNullOrWhiteSpace(val)) 
      { 
       return ModelBindingResult.SuccessAsync(bindingContext.ModelName, val); 
      } 
      else if (Int16.TryParse(val, out value) && value >= 0) 
      { 
       return ModelBindingResult.SuccessAsync(bindingContext.ModelName, value); 
      } 
      else 
      { 
       bindingContext.ModelState.AddModelError(bindingContext.ModelName, "The value is invalid."); 
      } 
     } 

     return ModelBindingResult.FailedAsync(bindingContext.ModelName); 
    } 
} 

E nel caso in cui l'abitudine valore non è specificato nella URI si dovrebbe impostare un valore valido (maggiore di 0) tuttavia è sempre come default 0, anche se il controller appare come segue:

public async Task<IActionResult> GetAsync(
     [ModelBinder(BinderType = typeof(CustomQueryModelBinder))]short value = 100, 

valutare qui Fondamentalmente dovrebbe essere impostato su 100 come valore predefinito quando restituisce come null da ModelBinder.

Tuttavia, ciò non sta accadendo e viene costantemente restituito come 0 che risulta in System.ArgumentOutOfRangeException quando si tenta di eseguire un Get.

Stiamo usando RC1.

risposta

0

Sostituire short value = 100 con short? value = 100 sembra aver funzionato per me. Evviva per tipi nullable.

Problemi correlati