【问题标题】:ASP.NET MVC Converting null to zero-length stringASP.NET MVC 将 null 转换为零长度字符串
【发布时间】:2011-07-20 00:20:57
【问题描述】:

我正在使用 MVC 3 并尝试将字段留空以作为零长度字符串而不是空值发送到数据库。这可能与数据注释属性有关吗?

如果不是,从空值转换的最合适的位置是什么?是在模型验证期间吗?

【问题讨论】:

    标签: validation asp.net-mvc-3


    【解决方案1】:

    我不会在验证器中这样做,但可能会改为在模型绑定中(甚至在模型本身中)。

    通常,在我的模型类中,我将字符串属性设置为默认为空字符串,并且在它们的设置器中,我将空值转换为空字符串。

    一遍又一遍地写这些重复的东西有点痛苦,但不必处理空值要好得多。

    【讨论】:

    • 我将采用您的解决方案,但我很失望需要修改模型来解决视图问题。我将阅读有关模型绑定的更多信息。
    • 克里斯,我认为数据注释属性也是解决此问题的有效方法。我个人选择默认为空字符串的属性,因为我讨厌处理空值。
    • 我花了一些时间思考这个问题,必须完全同意你的看法。
    • @Chris,很高兴能为您提供帮助。祝你好运!
    • @Chris,看看这个答案:stackoverflow.com/questions/3475273/…
    【解决方案2】:

    在构造函数中设置属性等于string.empty

    或者,虽然这有点贵,但您可以创建一个执行以下操作的扩展方法,然后在构造函数中调用它:

     var stringPropertyInfos = GetType()
                      .GetProperties(BindingFlags.Instance|BindingFlags.Public)
                      .Where(p => p.PropertyType == typeof(string));
     foreach(var propertyInfo in stringPropertyInfos){
         propertyInfo.SetValue(this,string.Empty,null);
     }
    

    【讨论】:

    • 我不确定这是一种合适的方法。虽然聪明,但有点过分。
    • 当然。这是最简单的方法。 ModelMetadata 已经进行了反射,因此将其分配在那里可能更有意义。您始终可以覆盖DefaultModelBinder,并将其分配给string.Empty,而不是默认为null。
    • 基本上你是在建议我遍历一个类中所有公共的、非静态的字符串属性。我的评论是,无论何时何地,这似乎都是一件不合适的事情。虽然这是一个聪明的解决方案,但我对将类似的东西放入生产代码持谨慎态度,尤其是其他人可能必须维护的代码。在您的评论中,您提到了 DefaultModelBinder。这似乎不是您原始答案的一部分。你是在暗示我错过了你的意思吗?
    • 不,它们是不同的答案。 ModelBinder 将 ValueProviders 的值绑定到 Controller Action 的参数。如果您将表单直接绑定到数据库调用,则此方法有效。我认为这不是一个好习惯,因为您正在混合关注点。我认为,如果它是一个数据模型,那么您应该在其构造函数中使用其预期的默认值初始化属性。基本上,您不应该能够在应用程序的数据层中实例化无效的东西。这就是为什么我建议将反射方法作为捷径。
    • 但是,如果此模型是视图模型,那么更好的解决方案是使用模型绑定器,因为您可以节省额外反射的成本。但是,如果这是一个 DAL 对象,那么在 ModelBinder 中执行此操作会导致将 UI 耦合到 DAL 的潜在更大问题。我仍然认为最好的方法是在构造函数中手动设置你的属性,并且不允许它们被设置为无效,但除非你正在做一些比我提供给你的快速解决方案需要更多工作的代码生成。
    【解决方案3】:

    虽然不理想,但这是我所知道的最好的方式:[DisplayFormat(ConvertEmptyStringToNull = false)] 在属性上方。它将逻辑保留在模型中,这是一种很好的做法,它直接解决了问题。这是必要的,这真是令人遗憾。

    private string _summary = "";
    [Required]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public virtual string Summary
    {
        get { return _summary; }
        set { _summary = value; }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多