大家看看我这个有什么问题?
加了Required特性标记
前台也有相应的验证标签
我把UserName空着,提交
结果还是异常了,如第一张图所示。不是应该在页面上出现错误提示吗?
你设置了不可为空,执行代码的时候就会判断值是否为空。不会出现在页面的
那能不能让它先做mvc的数据校验?只能将字段设为可空的吗?那样做不合理吧
@Invictus: 自定义一个特性吧。别用Required 特性。 根据自己的需求来验证。
自己构造一个model builder,来构建model
[Display(Name = "编号:")] [Required(ErrorMessage = "必填项")] [StringLength(20, ErrorMessage = "必须为 {2}-{1} 个字符之间。", MinimumLength = 1)] [RegularExpression(@"^\d+$", ErrorMessage = "必须为数字")] public string NewCode { get; set; }
你这样子试试呢
为什么会报错是因为属性required是事后检测,也就是set里面执行完了之后检测的。UserName在设计时是不可为空的,所以在set时会检测到异常,但是这异常不属于required检测到的,那么mvc那一套捉不到这个错误。解决办法是用MetadataType:
[MetadataType(typeof(BlogPostMetadata))]
public partial class BlogPost
{
}
public class BlogPostMetadata
{
[Required(ErrorMessage="Title is required.")]
public string Title;
[Required(ErrorMessage="Body is required.")]
public string Body;
}
一般现在都用codefirst 来使用EF,这样就可以避免自动生成的代码的干扰。
谢谢,你分析的有道理。可我按你说的做了,还是出现上面的异常。
上面是我加的代码,麻烦你帮我看看
我看到一篇文章UserInfoMetadata类是在UserInfo内部
http://www.cnblogs.com/chshnan/archive/2011/07/08/2100713.html
你看看
@Invictus: 相信经过如上我给的那段代码,在不是调试的状态下,可以捉到BlogPostMetadata里面给出的异常信息而不是之前的值无效。至此,已经达到了validate校验目的。若是还想完全去掉StructuralObject.SetValidValue(value, false)的异常,那么注意到ef会自动生成类似如下的代码:
partial void OnAliasChanging(global::System.String value);
partial void OnAliasChanged();在调用StructuralObject.SetValidValue(value, false)前会调用OnXXXXChanging,这里默认两个都是虚拟方法,那么我们可以在这个类设置全局变量IsValidate,自己实现OnXXXXChanging,在OnXXXXChanging里面若是检测到异常则设置IsValidate=false,在执行StructuralObject.SetValidValue前,检测IsValidate是否为真,若是false则不再执行StructuralObject.SetValidValue。