我有一些带有很多字符串参数的web Api动作。对于其中一些参数,客户端发送空字符串而不是null,但我需要在空字符串的情况下在数据库中保存null。我尝试使用模型绑定器和JSONconvertor但是失败了。
FYI;我需要一个通用的解决方案,因为我不想在方法体内部检查参数并将它们替换为null。
答案 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; }