2014-07-19 16 views
9

Więc mam zwyczaj modelu Binder wdrożony DateTime typu i zarejestrować go jak poniżej:Web API ModelBinding Od URI

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

a potem mam setup 2 akcje przykładowych aby sprawdzić, czy mój zwyczaj modelu wiązania odbywa :

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

Kiedy biegnę i powoływać się zarówno działania z wymienionych adresów URL, user „s JoinDate nieruchomość zostaje związany z powodzeniem przy użyciu niestandardowego spoiwo i skonfigurowany ale BindDateTime” sParametrnie zostanie powiązany za pomocą niestandardowego modułu wiążącego.

Podałem już w config, że wszystkie DateTime powinny używać mojego niestandardowego segregatora, a następnie dlaczego obojętność? Sugestie są wysoko cenione.

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

UWAGA: Jeśli używam [FromUri(Binder=typeof(CurrentCultureDateTimeAPI))]DateTime datetime to działa zgodnie z oczekiwaniami, ale potem znowu, dlaczego?

+1

Być może to dlatego, że jesteś ustawienie [FromUri] atrybut - API internetowa korzysta formatek zamiast modelu wiążące, więc niestandardowy segregator nie jest używany.Spróbuj usunąć atrybut [FromUri] w metodzie BindDateTime. –

+0

@IlyaLuzyanin Nie. To nie działa. – lbrahim

+0

Masz rację, [FromUri] nie ma z tym nic wspólnego. Próbowałem odtworzyć twój scenariusz - wszystko działa dobrze, mój niestandardowy model jest nazywany w obu metodach. Czy możesz podać kod CurrentCultureDateTimeAPI? –

Odpowiedz

5

Dość zaskakujące też :)

Moja początkowa wątpienia była to linia:

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

MSDN mówi GlobalConfiguration =>GlobalConfiguration provides a global System.Web.HTTP.HttpConfiguration for ASP.NET application.

Ale z dziwnych powodów nie wydaje się, że działa z tym szczególnym scenariuszem.

Więc

Wystarczy dodać tę linię wewnątrz klasy statycznej WebApiConfig

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

tak, że plik WebAPIConfig wygląda następująco:

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

I wszystko działa dobrze, ponieważ ta metoda jest bezpośrednio wywoływana przez WebAPI framework, więc na pewno Twój CurrentCultureDateTimeAPI zostanie zarejestrowany.

Sprawdzone rozwiązanie i działa wspaniale.

Uwaga: (z komentarzy) Możesz nadal obsługiwać Attribute Routing i nie musisz komentować tej linii config.MapHttpAttributeRoutes().

Ale wciąż Byłoby wspaniale, jeśli ktoś może powiedzieć dlaczego GlobalConfiguration nie wyjdzie

-5

Wygląda na to, że chcesz opublikować pewne dane na serwerze. Spróbuj użyć FromData i opublikuj JSON. FromUri jest zwykle używany do pobierania niektórych danych. Skorzystaj z konwencji WebAPI i pozwól, aby działał dla Ciebie.