2012-06-06 85 views
2

我最近從MVC4測試版更新到RC,並且遇到了WebApi項目的一個小問題。我注意到的第一件事之一是ServiceResolver被刪除。之前它被刪除,我用它來註冊通過以下方式自定義模型粘合劑供應商:如何註冊MVC4 RC中的自定義模型綁定器WebApi

IEnumerable<object> modelBinderProviderServices = GlobalConfiguration.Configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider)); 
List<Object> services = new List<object>(modelBinderProviderServices) { new CustomDynamicObjectModelBinderProvider() }; 
GlobalConfiguration.Configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray()); 

它利用這種模式,粘合劑供應商的優勢作用有以下特徵:

[HttpPut] 
public void Put(CustomDynamicObject model) 

我試着用以下,但沒有結果,以取代舊代碼:

GlobalConfiguration.Configuration.Services.Add(typeof(ModelBinderProvider), new CustomDynamicObjectModelBinderProvider()); 

當我試圖將數據放置到給定的動作,該模型提供的GetBinder方法不調用並且模型參數設置爲null。我能夠通過改變Acion /方法的簽名下面的

[HttpPut] 
public void Put([ModelBinder(typeof(CustomDynamicObjectModelBinderProvider))] CustomDynamicObject model) 

使動作使用通過ModelBinder的屬性通緝ModelBinder的雖然這個作品我真的不希望在使用此語法我所有的控制器/操作。

我想我應該提到的是我的模型綁定提供商繼承:

System.Web.Http.ModelBinding.ModelBinderProvider 

我這樣說,因爲我看到有下面的命名空間中的另一個ModelBinderProvider類:

Microsoft.Web.Mvc.ModelBinding 

回顧一下:如何在MVC4 RC WebApi中註冊一個自定義模型綁定器?

回答

7

自API以來,Web API中的模型綁定規則發生了變化。新規則在Mike Stall's post中描述。現在,對於複雜類型的模型綁定僅在您明確將ModelBinder屬性添加到參數時纔有效。

自發布候選版本起,參數綁定機制已經更改,因此您可能要在做太多更改之前等待RTM。在RC版本中還有其他一些選項可用 - 取決於您嘗試綁定的數據的來源(查詢字符串或請求主體)。

  • 如果您的數據源是請求主體,那麼你可以創建自定義MediaTypeFormatter,而不是一個模型綁定:

  • 如果您的數據來自查詢字符串,並要避免明確包括[ModelBinder]屬性,那麼您可以使用custom TypeConvertercustom IValueProvider的組合。

在RTM版本(或電流Nightlies版),你就可以使用自定義HttpParameterBinding如果其他選項不起作用。

+0

感謝您的澄清。你鏈接到的帖子也幫助我弄清楚了一些事情。 –