2016-06-02 5 views
0

Ich schreibe einen benutzerdefinierten Modelbinder für mein Webapi. Ich versuche, die Querystring zu bekommen und die Modelleigenschaften zu füllen. Ich bekomme das richtige Modell, aber es fehlen die Validierungsattribute für die Modelleigenschaften. Kann mir jemand sagen, was ich falsch mache? Hier finden Sie meine benutzerdefinierte Modellbinder und das Modell.WebApi CustomModelBinder führt keine Validierungen für die Modelleigenschaften durch

public class SearchCriteriaModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof(SearchCriteria)) 
     { 
      return false; 
     } 

     var searchCriteria = new SearchCriteria(); 
     var type = searchCriteria.GetType(); 

     var querystringVals = actionContext.Request.GetQueryNameValuePairs(); 
     var keyValuePairs = querystringVals as IList<KeyValuePair<string, string>> ?? querystringVals.ToList(); 
     if (!keyValuePairs.Any()) 
     { 
      bindingContext.Model = searchCriteria; 
      return true; 
     } 

     foreach (var value in keyValuePairs) 
     { 
      var key = value.Key; 
      var prop = type.GetProperty(key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance); 
      if (prop == null) 
      { 
       continue; 
      } 
      prop.SetValue(searchCriteria,value.Value); 
     } 

     bindingContext.Model = searchCriteria; 

     return true; 
    } 
} 


public class SearchCriteria 
{ 
    public SearchCriteria() 
    { 
     Param1 = ""; 
     Param2 = ""; 
     PageIndex = 0; 
     PageSize = 10; 

    } 
    public string Param1 { get; set; } 
    public string Param2 { get; set; } 
    public int PageIndex{ get; set; } 
    public int PageSize { get; set; } 
    [IsNumeric] 
    publist string MinimumVal {get;set;} 
} 

Dank

Antwort

0

Validator.TryValidateObject (..) wird das Modell in der Modelbinder validieren.

var validationResults = new Collection<ValidationResult>(); 
     var isValid = Validator.TryValidateObject(searchCriteria, new ValidationContext(searchCriteria, null, null), validationResults, true); 
     if (!isValid) 
     { 
      foreach (var result in validationResults) 
      { 
       bindingContext.ModelState.AddModelError("", result.ErrorMessage); 
      } 
     } 
Verwandte Themen