2013-02-04 16 views
8

Uso in alcuni modelli una classe di sottocodice (UserInfo) che dovrebbe contenere alcune informazioni relative all'utente. Questo modello sub può essere utilizzato in vari modelli, ad esempioModelBinder e submodel

public class Model 
{ 
    int string Value { get; set; } 
    public UserInfo User { get; set; } 
} 

ho creato un modello di legante e registrato in WebApiConfig

config.BindParameter(typeof(UserInfo), new UserModelBinder()); 

La cosa è l'UserModelBinder non viene chiamato dalla WebAPI pipeline di elaborazione. Sembra che questi modelbinders non siano chiamati per i sub-modelli. Mi sto perdendo qualcosa ?

risposta

1

Dai un'occhiata a questa domanda What is the equivalent of MVC's DefaultModelBinder in ASP.net Web API? per alcuni dettagli su dove i tuoi attacchi stanno per accadere.

Sospetto però che il tuo Model venga passato nel corpo del messaggio?

Se è allora WebAPI userà un formattatore per i tipi di deserialise ed elaborare il modello, le impostazioni predefinite che sono XmlMediaTypeFormatter, JsonMediaTypeFormatter o FormUrlEncodedMediaTypeFormatter.

Se si sta pubblicando il modello nel corpo, a seconda del tipo di contenuto richiesto o accettato (applicazione/xml, applicazione/json, ecc.) Potrebbe essere necessario personalizzare le impostazioni del serializzatore o avvolgere o implementare il proprio MediaTypeFormatter.

Se si utilizza application/json, è possibile utilizzare JsonConverters per personalizzare la serializzazione della classe UserInfo. V'è un esempio di questo qui Web API ModelBinders - how to bind one property of your object differently e qui WebApi Json.NET custom date handling

internal class UserInfoConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeOf(UserInfo); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, 
           JsonSerializer serializer) 
    { 
     // 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     // 
    } 
} 
1

HttpConfigurationExtensions.BindParameter metodo Registrazione che il determinato tipo di parametro in un'azione deve essere vincolato mediante il legante modello .

così quello che hai fatto è simile a:

void Action([ModelBinder(UserModelBinder)] UserInfo info) 

Funziona solo se il parametro azione è di tipo specificato (UserInfo).

provare a mettere il modello di dichiarazione legante su UserInfo classe stessa, in modo che sia globale:

[ModelBinder(UserModelBinder)] public class UserInfo { } 

Tuttavia, ci sono alcune differenze nel modo in cui WebAPI e parametri legano MVC. Ecco il dettaglio di Mike Stall explanation.

+0

Mettere l'attributo ModelBinder non funziona neanche. – user49126

Problemi correlati