ModelBinder和子模型

use*_*126 8 model-binding asp.net-mvc-4 asp.net-web-api

我在某些模型中使用了一个子模型类(UserInfo),它应包含一些与用户相关的信息.例如,该子模型可用于各种模型

public class Model
{
     int string Value { get; set; }
     public UserInfo User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个模型绑定器并在WebApiConfig中注册了它

config.BindParameter(typeof(UserInfo), new UserModelBinder());
Run Code Online (Sandbox Code Playgroud)

问题是WebApi处理管道没有调用UserModelBinder.似乎没有为子模型调用这些模型绑定器.我错过了什么吗?

Mar*_*nes 1

看看这个问题What is the相当于MVC的DefaultModelBinder in ASP.net Web API? 有关绑定发生位置的一些详细信息。

我怀疑你的消息Model是在消息正文中传递的?

如果是,那么 WebApi 将使用格式化程序来反序列化您的类型并处理模型,默认值为XmlMediaTypeFormatter,JsonMediaTypeFormatterFormUrlEncodedMediaTypeFormatter

如果您在正文中发布模型,那么根据您请求或接受的内容类型(application/xml、application/json 等),您可能需要自定义序列化器设置或包装或实现您自己的MediaTypeFormatter.

如果您使用 application/json 那么您可以用JsonConverters来自定义 UserInfo 类的序列化。这里有一个这样的例子:Web API ModelBinders - how to bind a property of your object different and here 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)
    {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)