我试图让一个实体框架字符串属性的服务器端验证工作.其他服务器端验证(如数据类型验证和所需的dateTime和数字EF属性)正在工作.
这在VS 2010,.Net 4.0,MVC2 Cloud,ADO.Net实体框架.
我有问题的字符串属性映射到sql 2008,Varchar(50)不可空列.
当我尝试使用此属性的空字符串发布到我的创建操作时,我会收到以下错误.
Exception Details: System.Data.ConstraintException: This property cannot be set to a null value.
当我以空白的方式发布到动作时,我成功获取了一个必需的字段验证消息.
我已经尝试使用数据注释和ClientSideValidation,但似乎有一些ClientSideValidation在部分视图和jquery对话框中工作.
[EdmScalarPropertyAttribute(EntityKeyProperty=false,IsNullable=false)] [DataMemberAttribute()] public global::System.String GradeTypeName { get { return GradeTypeName; } set { OnGradeTypeNameChanging(value); ReportPropertyChanging("GradeTypeName"); _GradeTypeName = StructuralObject.SetValidValue(value,false); ReportPropertyChanged("GradeTypeName"); OnGradeTypeNameChanged(); } }
根据Action方法(CREATE或EDIT)的签名,在调用UpdateModel()方法之前或方法中可能会发生异常.内部异常是在model.designer.cs文件的下方.
_GradeTypeName = StructuralObject.SetValidValue(value,false);
我已经能够在一个简单的mvc2 Web应用程序上重现.
解决方法
我有同样的问题一段时间.我在这里找到了一个解释:
http://mvcmusicstore.codeplex.com/workitem/6604.简而言之,实体的属性验证引发了异常“System.Data.ConstraintException:此属性不能设置为空值”.当您的mvc应用程序尝试将表单域绑定到相应的实体属性(称为PreBinding验证,并在提交表单时发生),则会执行此验证.由于该字段为空(因此转换为null),绑定器尝试将一个空值绑定到该属性,这违反了您的实体的属性的非空限制.
但是,如果您发布一个空白字段(不同于空,因此为空)实体验证通过(因为该属性未设置为空值),然后您可以从“必需”注释验证看到该消息,该在预绑定之后执行(它是PostBinding验证).
解决方法是使用告示您的绑定器不将空字符串转换为空的[DisplayFormat(ConvertEmptyStringToNull = false)]注释.
[required] [DisplayFormat(ConvertEmptyStringToNull = false)] public string YourStringProperty { get; set;}
希望这可以帮助!