web api action参数将空字符串参数转换为null

时间:2015-02-10 23:48:57

标签: c# rest asp.net-web-api asp.net-web-api-routing

我有一些带有很多字符串参数的web Api动作。对于其中一些参数,客户端发送空字符串而不是null,但我需要在空字符串的情况下在数据库中保存null。我尝试使用模型绑定器和JSONconvertor但是失败了。

FYI;我需要一个通用的解决方案,因为我不想在方法体内部检查参数并将它们替换为null。

3 个答案:

答案 0 :(得分:3)

感谢Sarathy,您的解决方案也可以运行,但我最终解决了以下问题: 1)创建自定义模型绑定器,如下所示

 public class EmptyStringModelBinder : System.Web.Mvc.IModelBinder
    {
        public object BindModel(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext)
        {
            string key = bindingContext.ModelName;
            ValueProviderResult val = bindingContext.ValueProvider.GetValue(key);
            if (val != null)
            {
                var s = val.AttemptedValue as string;
                if (s != null && (s.IsEmpty() || s.Trim().IsEmpty()))
                {
                    return null;
                }

                return val.AttemptedValue;
            }

            return null;
        }
    }

2)使用ModelBinder属性标记动作方法参数

public ActionResult UpdateAttribute(int id, 
                                     int AttributeTypeId,
                                     int? Number_Value, 
                                     decimal? Money_Value,
                                            [ModelBinder(typeof(EmptyStringModelBinder))]string Text_Value)

或者您可以在配置中添加此模型绑定器。它将检查所有字符串参数并将空字符串替换为null(可能不需要)

答案 1 :(得分:3)

如果在字符串属性上使用[Required]属性,但在数据库中使其可为空,则WebApi会将在Json中接收的空字符串转换为空值。

我的要求恰恰相反。我在数据库中有一个不可为空的字段,并希望将空字符串保存到数据库中。对于此要求,我必须删除[Required]属性并添加[DisplayFormat(ConvertEmptyStringToNull = false)]

然后JSON中的空字符串被持久保存到数据库中。

答案 2 :(得分:2)

您可以在字符串属性上使用DisplayFormat属性自动将空字符串转换为null。

[DisplayFormat(ConvertEmptyStringToNull = true)]
public string MyString { get; set; }