2015-04-01 95 views
1

給出以下車型自定義模型綁定在網絡API基類

public class RequestBase 
{ 
    public DateTime TransactionTimestamp { get; set; } 

    public Guid RequestMessageId { get; set; } 

} 

[ModelBinder(typeof(RequestBaseModelBinder))] 
public class StandardRequest : RequestBase 
{ 

    public Guid MyGuidId { get; set; } 

    public int MyIntId { get; set; } 

} 

RequestBase值通過頭部信息所以我想實現一個自定義模型粘合劑將它們綁定到模型

這是我這麼遠

public class RequestBaseModelBinder :IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     var requestBase = bindingContext.Model as RequestBase; 

     if (requestBase != null) 
     { 
      requestBase.RequestMessageId = 
       Guid.Parse(actionContext.Request.Headers.GetValues("RequestMessageId").FirstOrDefault()); 

      requestBase.TransactionTimestamp = 
       DateTime.Parse(actionContext.Request.Headers.GetValues("TransactionTimestamp").FirstOrDefault()); 

      return true; 
     } 

     return false; 
    } 
} 

它目前還不爲bindingContext.Model工作爲空

回答

1

不,bindingContext.Model是您將從您的操作參數中獲得的對象。

你應該從actionContext.Request得到您的頭,建立一個模型,以及模型設置爲bindingContext.Model

代碼想:

Dictionary<string, string> kvps = new Dictionary<string, string>(); 
     if (!string.IsNullOrEmpty(actionContext.Request.RequestUri.Query)) 
     { 
      kvps = actionContext.Request.GetQueryNameValuePairs().ToDictionary(a=>a.Key,a=>a.Value); 
     } 
     //Check and get source data from body 
     else if (actionContext.Request.Content.IsFormData()) 
     { 
      var bodyString = actionContext.Request.Content.ReadAsStringAsync().Result; 
      try 
      { 
       kvps = ConvertToKvps(bodyString); 
      } 
      catch (Exception ex) 
      { 
       bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex.Message); 
       return false; 
      } 
     } 
     else 
     { 
      bindingContext.ModelState.AddModelError(bindingContext.ModelName, "No input data"); 
      return false; 
     } 
     Object obj = null; 

     try 
     { 
      obj = new Something(kvps);//build your object by key value pairs 
     } 
     catch (Exception ex) 
     { 
      bindingContext.ModelState.AddModelError(
       bindingContext.ModelName, ex.Message); 
      return false; 
     } 

     bindingContext.Model = obj; 
     return true; 

看看這個例子: http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects