首页新闻找找看学习计划

mvc数据验证

0
悬赏园豆:10 [待解决问题]

大家看看我这个有什么问题?

加了Required特性标记

前台也有相应的验证标签

我把UserName空着,提交

结果还是异常了,如第一张图所示。不是应该在页面上出现错误提示吗?

Invictus的主页 Invictus | 初学一级 | 园豆:76
提问于:2013-02-18 16:18
< >
分享
所有回答(4)
0

你设置了不可为空,执行代码的时候就会判断值是否为空。不会出现在页面的

虔城墨客 | 园豆:194 (初学一级) | 2013-02-18 17:52

那能不能让它先做mvc的数据校验?只能将字段设为可空的吗?那样做不合理吧

支持(0) 反对(0) Invictus | 园豆:76 (初学一级) | 2013-02-18 18:07

@Invictus: 自定义一个特性吧。别用Required 特性。 根据自己的需求来验证。

支持(0) 反对(0) 虔城墨客 | 园豆:194 (初学一级) | 2013-03-20 10:46
0

自己构造一个model builder,来构建model

sinhbv | 园豆:2579 (老鸟四级) | 2013-02-18 20:52
0
     [Display(Name = "编号:")]
        [Required(ErrorMessage = "必填项")]
        [StringLength(20, ErrorMessage = "必须为 {2}-{1} 个字符之间。", MinimumLength = 1)]
        [RegularExpression(@"^\d+$", ErrorMessage = "必须为数字")]
        public string NewCode { get; set; }

你这样子试试呢

淘@淘 | 园豆:582 (小虾三级) | 2013-02-19 08:38
0

为什么会报错是因为属性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,这样就可以避免自动生成的代码的干扰。

arg | 园豆:1047 (小虾三级) | 2013-02-19 10:46

谢谢,你分析的有道理。可我按你说的做了,还是出现上面的异常。

上面是我加的代码,麻烦你帮我看看

支持(0) 反对(0) Invictus | 园豆:76 (初学一级) | 2013-02-20 09:46

我看到一篇文章UserInfoMetadata类是在UserInfo内部

http://www.cnblogs.com/chshnan/archive/2011/07/08/2100713.html

你看看

支持(0) 反对(0) Invictus | 园豆:76 (初学一级) | 2013-02-20 16:12

@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。

支持(0) 反对(0) arg | 园豆:1047 (小虾三级) | 2013-02-26 22:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册