2013-03-18 67 views
4

我一直在嘗試使用模型綁定來使我們的API更易於使用。當使用API​​時,只有在查詢中包含數據時,才能將模型綁定綁定到數據。如何在從身體綁定時自定義模型綁定器?

我的代碼是:

public class FunkyModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     var model = (Funky) bindingContext.Model ?? new Funky(); 

     var hasPrefix = bindingContext.ValueProvider 
             .ContainsPrefix(bindingContext.ModelName); 
     var searchPrefix = (hasPrefix) ? bindingContext.ModelName + "." : ""; 
     model.Funk = GetValue(bindingContext, searchPrefix, "Funk"); 
     bindingContext.Model = model; 
     return true; 
    } 

    private string GetValue(ModelBindingContext context, string prefix, string key) 
    { 
     var result = context.ValueProvider.GetValue(prefix + key); 
     return result == null ? null : result.AttemptedValue; 
    } 
} 

當在ValueProvider財產上的bindingContext我只看到QueryStringValueProviderRouteDataValueProvider我認爲這意味着,如果數據是在身體,我不會把它看。我應該怎麼做?我想支持發佈數據爲json或者form-encoded。

+0

你能描述更多關於您的情況?在webapi中,默認情況下,來自正文的數據通過格式化程序綁定。 – 2013-03-19 06:16:12

+0

那麼也許我應該使用格式化程序呢? – 2013-03-19 10:11:57

+0

是的..正確...看看下面的文章瞭解更多詳情:http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding的.aspx – 2013-03-19 14:28:14

回答

0

我正在研究這一點。

WebApis Model Binder附帶兩個內置的ValueProviders。

QueryStringValueProviderFactory & RouteDataValueProviderFactory中搜索哪個

,當你調用

context.ValueProvider.GetValue 

這個問題有如何從身體數據綁定一些代碼。

how to pass the result model object out of System.Web.Http.ModelBinding.IModelBinder. BindModel?

你可以創建一個自定義ValueProvider要做到這一點爲好,可能是一個更好的主意 - 這將搜索匹配關鍵字的值。上面的鏈接只是在模型聯編程序中執行此操作,這會將ModelBinder限制爲僅在本體中查看。

public class FormBodyValueProvider : IValueProvider 
{ 
    private string body; 

    public FormBodyValueProvider (HttpActionContext actionContext) 
    { 
     if (actionContext == null) { 
      throw new ArgumentNullException("actionContext"); 
     } 

     //List out all Form Body Values 
     body = actionContext.Request.Content.ReadAsStringAsync().Result; 
    } 

//實現接口,並使用代碼讀取體,並找到自己的價值符合重點 }