MVC2实体框架4中的REQUIRED字符串属性的服务器端验证不起作用

Hac*_*ngr 14 asp.net-mvc entity-framework data-annotations

我正在尝试使实体框架字符串属性的服务器端验证工作.其他服务器端验证(如数据类型验证和所需的dateTime和数字EF属性)正在运行.

这在VS 2010,.Net 4.0,MVC2 + Cloud,ADO.Net Entity Framework中.

我遇到问题的字符串属性映射到SQL 2008,Varchar(50)非可空列.

当我尝试使用此属性的空字符串发布到我的Create操作时,我得到了以下错误.

异常详细信息:System.Data.ConstraintException:此属性不能设置为空值.

当我使用空格发布到操作时,我成功获得了必填字段验证消息.

我尝试过使用Data Annotations和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();
    }
}
Run Code Online (Sandbox Code Playgroud)

根据Action方法(CREATE或EDIT)的签名,在调用UpdateModel()之前,可能会在步入方法之前或在方法内发生异常.内部异常位于model.designer.cs文件的下面一行.

_GradeTypeName = StructuralObject.SetValidValue(value, false);
Run Code Online (Sandbox Code Playgroud)

我已经能够在一个简单的mvc2 Web应用程序上重现这一点.

tin*_*oft 30

我有一段时间遇到同样的问题.我在这里找到了一条解释:http://mvcmusicstore.codeplex.com/workitem/6604.简而言之,实体的属性验证抛出异常" System.Data.ConstraintException:此属性不能设置为空值 ".当您的mvc应用程序尝试将表单字段绑定到相应的实体属性(它称为预绑定验证,并在提交表单时发生)时,将执行此验证.由于该字段为空(因此转换为null),绑定程序会尝试将null值绑定到属性,这违反了实体属性的Non-Null约束.

但是如果你发布一个空白字段(不同于空,因此为null)实体验证通过(因为属性不再设置为空值),然后你看到来自"必需"注释验证的消息,在预绑定之后执行(它的PostBinding验证).

解决方法是使用注释[DisplayFormat(ConvertEmptyStringToNull = false)]告诉绑定器不要将空字符串转换为null.

  [Required]
  [DisplayFormat(ConvertEmptyStringToNull = false)]
  public string YourStringProperty { get; set;}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 当框架尝试自动创建模式时,该列仍将设置为允许空值.如果希望列生成为非可空列,请将required属性更改为`[Required(AllowEmptyStrings = true)]`. (2认同)