【问题标题】:ModelBinder and sub modelsModelBinder 和子模型
【发布时间】:2013-02-07 17:42:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-web-api model-binding


    【解决方案1】:

    查看这个问题What is the equivalent of MVC's DefaultModelBinder in ASP.net Web API?,了解有关绑定将在何处发生的详细信息。

    我怀疑您的Model 正在邮件正文中传递?

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

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

    如果您使用的是 application/json,那么您可以使用JsonConverters 来自定义您的 UserInfo 类的序列化。这里有一个例子Web API ModelBinders - how to bind one property of your object differently和这里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)
        {
            //
        }
    }
    

    【讨论】:

      【解决方案2】:

      HttpConfigurationExtensions.BindParameter 方法注册 Action 的给定参数类型将使用模型绑定 活页夹。

      所以你所做的类似于:

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

      仅当动作参数为指定类型(UserInfo)时才有效。

      尝试将模型绑定器声明放在 UserInfo 类本身上,使其具有全局性:

      [ModelBinder(UserModelBinder)] public class UserInfo { }
      

      但是,WebAPI 和 MVC 绑定参数的方式存在一些差异。这是 Mike Stall 的详细信息explanation。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多