asp.net-mvc – MVC2中的REQUIRED String属性的服务器端验证实体框架4不起作用

我试图让一个实体框架字符串属性的服务器端验证工作.其他服务器端验证(如数据类型验证和所需的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;}

希望这可以帮助!

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....