如何让模型绑定器将空字符串保留为null?

时间:2009-07-09 16:48:42

标签: asp.net-mvc

我的Sql Server数据库有一些可以为空的nvarchar字段,并且没有包含空字符串的nvarchar字段。我想保持这种方式,但默认的MVC模型绑定器似乎将空字符串转换为空字符串。

当控制器检索null nvarchar数据库字段时,null字段在控制器内变为空字符串,并从那里呈现它们,例如空白文本框。发布页面时,默认模型绑定器使用这些空白文本框来更新模型,以前的空字符串将更改为空字符串。当数据更新回数据库时,空字符串会被空字符串覆盖。

获取模型绑定以保持这些空值不变的最简单方法是什么?

4 个答案:

答案 0 :(得分:1)

我知道您可能正在寻找更复杂的东西,但ModelBinder的默认行为是将空表单字段值转换为模型对象属性的数据类型的默认值。字符串属性变为空,int属性变为0等

显然,您可以创建一个验证方案,在更新数据库之前检查string.empty并转换为null。对于int表单字段,您需要检查0,然后转换为null。

答案 1 :(得分:0)

这是我几个月前在找到stackoverflow的eden之前使用过的hack。 :)这是一种痛苦,并且不能很好地扩展,但它有效:

基本上,您覆盖部分linq对象内部的绑定。如果有一个值,你应该知道它应该始终为null(但从不合法地为空),你可以执行以下操作。我将它用于基于字符串的用户ID(SID)。

partial void OnSubProcess_Owner_UserChanged()
{
    if (string.IsNullOrEmpty(this.SubProcess_Owner_User))
       this._SubProcess_Owner_User = null;
}

詹姆斯

答案 2 :(得分:0)

正确的答案可能是覆盖默认的模型绑定器以自行添加此功能。

也许您可以使用NullValueAttribute来应用于字符串属性以标识空值。然后将空字符串设为空值。

我目前遇到同样的问题,可能会诉诸这个

答案 3 :(得分:0)

我发布这个答案是为了贯彻这个问题。在使用它一段时间之后,我开始将此问题视为模型完整性普遍关注的一部分。有一段时间我在我的更新存储过程中实现了一个解决方案来捕获空字符串并将它们转换为空值,这与mikerennick上面的答案一致。后来我还想确保字段被修剪,我碰巧将应用程序移动到NHibernate(大多数存储过程都消失了)。最后,我嵌入了一些POCO逻辑来修剪并检查setter中的空字符串(来自任何来源),如下所示:

public MyClass {
  private string _name;
  public string Name {
    get { return _name; }
    set { _name = value.TrimToNullIfEmpty(); }
  }
}

public static class StringExtensions {
  public static string TrimToNullIfEmpty(this string s) {
    string temp = (s ?? "").Trim();
    return temp.Length == 0 ? null : temp;
  }
}