2016-06-02 5 views
0

私はwebapi用のカスタムモデルバインダーを作成しています。クエリ文字列を取得してモデルのプロパティを埋めようとしています。私は正しいモデルを取得していますが、モデルプロパティの検証属性がありません。誰かが私が間違っていることを伝えることはできますか?私のカスタムモデルのバインダーとモデルの下を見つけてください。WebApi CustomModelBinderが実行されていませんモデルプロパティの検証

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;} 
} 

おかげ

答えて

0

Validator.TryValidateObject(..)はmodelbinderでモデルを検証します。

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); 
      } 
     } 
関連する問題