2013-02-04 17 views
8

Używam w niektórych modelach sub modelu klasy (UserInfo), które powinny zawierać pewne informacje związane z użytkownikiem. Ten model sub może być stosowany w różnych modelach, na przykładModelBinder i sub modele

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

Mam stworzył model wiążący i zarejestrowanego go w WebApiConfig

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

Rzecz jest UserModelBinder nie jest wywoływana przez WebAPI rurociąg przetwarzający. Wydaje się, że te modelujące modele nie są wymagane dla modeli podrzędnych. Czy czegoś brakuje?

Odpowiedz

1

Spójrz na to pytanie What is the equivalent of MVC's DefaultModelBinder in ASP.net Web API?, aby dowiedzieć się, gdzie będą się działy wiązanie.

Podejrzewam jednak, że Twój Model jest przekazywany w treści wiadomości?

Jeśli jest następnie WebAPI będzie używać formatowania do deserialise swoje typy i przetworzyć modelu domyślne będące XmlMediaTypeFormatter, JsonMediaTypeFormatter lub FormUrlEncodedMediaTypeFormatter.

Jeśli publikujesz model w ciele, to w zależności od żądanego lub zaakceptowanego typu zawartości (aplikacja/xml, aplikacja/json itp.) Może być konieczne dostosowanie ustawień serializera lub zawijanie lub implementowanie własnego MediaTypeFormatter.

Jeśli używasz aplikacji/json, możesz użyć JsonConverters, aby dostosować serializację klasy UserInfo. Jest przykładem tutaj Web API ModelBinders - how to bind one property of your object differently i tutaj 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 sposób zarejestrować że danego typu parametru na działania jest związany za pomocą spoiwa modelu .

więc co zrobiłeś jest podobny do:

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

To działa tylko wtedy, gdy parametr akcja ma określonego typu (userinfo).

spróbuj umieścić wzór oświadczenia spoiwa na klasę samą userinfo, tak że to globalny:

[ModelBinder(UserModelBinder)] public class UserInfo { } 

Jednak istnieją pewne różnice w sposobie, jak i parametry wiązania WebAPI MVC. Oto szczegółowy opis Mike'a Stall'a: explanation.

+0

Uruchamianie systemu ModelBinder atrybut nie działa albo. – user49126