asp.net mvc 2:Model Validation

asp.net mvc 2中集成了Model验证机制。只需要少量代码,就能在网站必要的地方验证数据的正确有效性。ScottGu’s Blog上有一篇同名文章,APS.NET MVC 2 : Model Validation详述了Model验证的技术,包括如何在使用Entity Framework的情况下使用内置的验证机制。

在Model中,默认没有引用命名空间

using System.Web.Mvc;

结果就是当你要是用[Bind(Exclude="ID")]这个属性的时候,找不到命名空间。这个细节在ScottGu的文章中没有说明。第二个问题是,当我自定义一个用来验证的Attribute时,在使用Post验证时表现正常,在使用Ajax验证时就无法显示验证结果了。这一点也百思不得其解。

在使用DropDownListFor验证譬如文章归属哪个类别时,有一个属性非常重要。例如:


[Required(ErrorMessage = "Please select a Whatever!")]
[DisplayFormat(ConvertEmptyStringToNull = false)]
public class Whatever {
public int DropDownListReference { get; set; }
}

其中的[DisplayFormat(ConvertEmptyStringToNull=false)]属性,可以触发当下拉列表没有选中项时的Require检验。

当你在修改模式时,或者当你Create触发了检验失败时,务必记得要再初始化一次下拉列表的数据源。DropDownList只会保持一个单一的值,不会保持一个IEnumerable的对象。即使你复制给Model的一个属性或者赋值给ViewData也不行。感觉很奇怪。如果不这样做,你就会收到错误信息。当然,你不用担心状态保持问题,即使你的IEnumerable对象是新创建出来的,它也会如实的保持你的选中项。

MVC中有很多隐藏技巧,如果可能,真的想好好的看一下书。同学们,有好书推荐一下吗?