2014-07-19 48 views
9

所以我有一個自定義的模型綁定實現了DateTime類型,我註冊它象下面這樣:的Web API ModelBinding從URI

void Application_Start(object sender, EventArgs e) 
{ 
    // Code that runs on application startup 
    GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI()); 
} 

,然後我有安裝2樣的行動,看看我的自定義模型發生結合:

[HttpGet] 
    public void BindDateTime([FromUri]DateTime datetime) 
    { 
     //http://localhost:26171/web/api/BindDateTime?datetime=09/12/2014 
    } 


    [HttpGet] 
    public void BindModel([FromUri]User user) 
    { 
     //http://localhost:26171/web/api/BindModel?Name=ibrahim&JoinDate=09/12/2014 
    } 

當我運行,並從提到的URL調用這兩個動作,userJoinDate財產得到成功使用定製綁定我配置的約束,但BindDateTimedatetime參數未使用自定義聯編程序進行綁定。

我已經在配置中指定所有DateTime應該使用我的自定義綁定,那麼爲什麼冷漠?建議非常感謝。

CurrentCultureDateTimeAPI.cs:

public class CurrentCultureDateTimeAPI: IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture); 
     bindingContext.Model = date; 
     return true; 
    } 
} 

注意:如果我使用[FromUri(Binder=typeof(CurrentCultureDateTimeAPI))]DateTime datetime那麼它將按預期工作,但話又說回來,爲什麼?

+1

可能是因爲你設置一個[FromUri]屬性 - 網頁API使用格式化的,而不是模型綁定,所以你不使用自定義模型聯編程序。嘗試從BindDateTime方法中刪除[FromUri]屬性。 –

+0

@IlyaLuzyanin號不起作用。 – lbrahim

+0

你說得對,[FromUri]與此無關。我試圖重現您的場景 - 一切正常,我的自定義模型聯編程序在兩種方法中都被調用。你能提供CurrentCultureDateTimeAPI代碼嗎? –

回答

5

相當令人吃驚太:)

我最初的懷疑是這條線:

GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI()); 

MSDN說:GlobalConfiguration =>GlobalConfiguration provides a global System.Web.HTTP.HttpConfiguration for ASP.NET application

但出於奇怪的原因,這似乎不適用於這種特殊的情況。

所以,

只需添加靜態類中此行WebApiConfig

config.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI()); 

讓您WebAPIConfig文件看起來像:

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "web/{controller}/{action}/{datetime}", 
       defaults: new { controller = "API", datetime = RouteParameter.Optional } 
      ); 

      config.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI()); 
     } 

,一切工作正常,因爲這種方法是直接由WebAPI framework調用,因此確保您的CurrentCultureDateTimeAPI獲得註冊。

檢查了您的解決方案,並且效果很好。

注意:(來自評論)你仍然可以支持Attribute Routing,你不需要註釋掉這一行config.MapHttpAttributeRoutes()

但儘管如此,這將是巨大的,如果有人能告訴爲什麼GlobalConfiguration不工作了

-5

它看起來像你想發佈一些數據到服務器。嘗試使用FromData併發布JSON。 FromUri通常用於獲取一些數據。使用WebAPI的約定,並允許它爲你工作。