2013-02-04 6 views
8

Ich verwende in einigen Modellen eine Untermodellklasse (UserInfo), die einige benutzerbezogene Informationen enthalten sollte. Dieses Teilmodell kann in verschiedenen Modellen verwendet werden, zum BeispielModelBinder und Untermodelle

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

ich ein Modell Binder erstellt haben und registriert es in WebApiConfig

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

Die Sache ist die UserModelBinder nicht durch die WebAPI genannt Verarbeitungs-Pipeline. Es scheint, dass diese Modellbinder für die Untermodelle nicht aufgerufen werden. Fehle ich etwas?

Antwort

1

Werfen Sie einen Blick auf diese Frage What is the equivalent of MVC's DefaultModelBinder in ASP.net Web API? für einige Details, wo Ihre Bindungen passieren werden.

Ich vermute zwar, dass Ihre Model im Nachrichtentext übergeben wird?

Wenn es dann WebAPI einen Formatierer verwenden Ihre Typen deserialise und das Modell zu verarbeiten, die Standardeinstellungen zu sein XmlMediaTypeFormatter, JsonMediaTypeFormatter oder FormUrlEncodedMediaTypeFormatter.

Wenn Sie das Modell im Hauptteil veröffentlichen, dann müssen Sie je nach dem von Ihnen angeforderten oder akzeptierten Inhaltstyp (application/xml, application/json usw.) die Einstellungen des Serialisers anpassen oder eigene MediaTypeFormatter implementieren oder implementieren. Wenn Sie die Anwendung/json verwenden, können Sie JsonConverters verwenden, um die Serialisierung Ihrer UserInfo-Klasse anzupassen. Es ist ein Beispiel dafür hier Web API ModelBinders - how to bind one property of your object differently und hier 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 Verfahren registrieren, dass der gegebenen Parametertyp zu einem Aktions gebunden werden soll, das Modell Bindemittel verwendet.

so was du getan hast ist ähnlich:

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

Es funktioniert nur, wenn Aktionsparameter des angegebenen Typs ist (Userinfo).

Versuchen setzen Binder Modell Erklärung auf Userinfo-Klasse selbst, so dass es global ist:

[ModelBinder(UserModelBinder)] public class UserInfo { } 

Allerdings gibt es einige Unterschiede in der Art und Weise, wie WebAPI und MVC binden Parameter. Hier ist Mike Stalls detaillierte explanation.

+0

Putting das Attribut nicht Modelbinder entweder funktioniert. – user49126