Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation ASP.NET MVC将空字符串转换为零长度字符串_Validation_Asp.net Mvc 3 - Fatal编程技术网

Validation ASP.NET MVC将空字符串转换为零长度字符串

Validation ASP.NET MVC将空字符串转换为零长度字符串,validation,asp.net-mvc-3,Validation,Asp.net Mvc 3,我正在使用MVC 3,并尝试将字段留空,以作为零长度字符串而不是空字符串发送到数据库。这可能与数据注释属性有关吗 如果不是,从空值转换为空值最合适的位置是什么?是在模型验证期间吗?我不会在验证器中执行此操作,但可能会在模型绑定中执行(甚至在模型本身中) 通常,在我的模型类中,我将字符串属性设置为默认为空字符串,在它们的设置器中,我将null转换为空字符串 一遍又一遍地写这些重复的东西有点痛苦,但是不必处理null就更好了。在构造函数中将属性设置为string.empty 或者,虽然这样做的成本稍

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


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

我不会在验证器中执行此操作,但可能会在模型绑定中执行(甚至在模型本身中)

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


一遍又一遍地写这些重复的东西有点痛苦,但是不必处理null就更好了。

在构造函数中将属性设置为
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);
 }

虽然不理想,但这是我所知道的最好的方法:
[DisplayFormat(ConvertEmptyStringToFull=false)]
在属性上方。它将逻辑保留在模型中,这是一种良好的实践,它直接解决了这个问题。这是必要的,真让人失望

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

我不确定这是一个合适的方法。虽然很聪明,但还是有点多。这是最简单的方法。ModelMetadata已经进行了反射,因此在那里分配它可能更有意义。您可以随时重写
DefaultModelBinder
,并让它将字符串分配给
string.Empty
,而不是默认为null。基本上,您建议我迭代类中所有公共的非静态字符串属性。我的意见是,无论你在什么地方或什么时候做这件事,似乎都是不合适的。虽然这是一个聪明的解决方案,但我对将类似的内容放入生产代码中持谨慎态度,尤其是其他人可能必须维护的代码。您在评论中提到DefaultModelBinder。这似乎不是你最初答案的一部分。你是说我没有领会你的意思吗?不,它们是不同的答案。ModelBinder将ValueProviders的值绑定到控制器操作的参数。如果要将表单直接绑定到数据库调用,则可以使用此方法。我认为这不是一个好的做法,因为你把各种顾虑混在了一起。我认为,如果它是一个数据模型,那么您应该在其构造函数中使用预期的默认值初始化属性。基本上,您不应该能够在应用程序的数据层中实例化无效的内容。这就是为什么我建议使用反射方法作为捷径。但是,如果此模型是视图模型,则更好的解决方案是使用模型绑定器,因为这样可以节省额外反射的成本。但是,如果这是一个DAL对象,那么在ModelBinder中执行此操作将导致一个潜在的更大问题,即将UI耦合到DAL。我仍然认为最好的方法是在构造函数中手动设置属性,并且不允许将它们设置为无效,但是,除非你正在做一些codegen,它需要比我提供的快速解决方案多得多的工作。我同意你的解决方案,但我不希望修改模型来解决视图问题。我将阅读更多关于模型绑定的内容。Chris,我认为数据注释属性也是一种有效的方法。我个人选择默认为空字符串的属性,因为我讨厌处理空字符串。我花了一些时间考虑这个问题,必须完全同意你的意见。@Chris,我很高兴能对你有所帮助。祝你好运@克里斯,看看这个答案: