mvc 3 + 企业库验证模块实现ajax 验证指定对象
在mvc 3下对模型的绑定、验证已经提供了很丰富简便的实现方法,最直接的就是将Action的参数设为要验证的模型,在提交到该Action时,mvc 会先自动根据表单的项赋值生成新对象,并且自动验证,我们只要检查modelstate.isvalid便可知道是否有项目验证结果。
但有时我们要指定验证哪个模型,并得到验证结果时,mvc 3似乎就不行了(我找了很久都没找到单独验证的方法),后来发现
EnterpriseLibrary 5里面有个验证模块就非常适合此需求,只要提供要验证的对象,便会对其验证,并且很友好的返回了
出错的列与值.
需求:表单项目排得很多时,我们提交保存后要先验证,将验证结果返回给前台弹出,并且每次只要验证一项即可,因为
一次只弹出一项。
思路:1:ajax 提交序列化表单的json提交到服务器.
2:根据json反序列化成对象
3:调用企业库验证模块来验证对象并返回结果给前台
ps: 要引入Enterprise library 5.0的 的common与validation程序集
第一步:先配置好经验证的类与验证其具体项的类之间的关系
//第一步:先配置好验证类的关系,我看有网友称之为伙伴类,其实就是
//给要验证的类绑字源数据,在运行时再取出来验证
#region 保存房源时验证
[MetadataType(typeof(Check_hs_house))]
public partial class hs_house
{ }
public class Check_hs_house
{
[Required(ErrorMessage = "请输入房源名称")]
public string housename { get; set; }
[Required(ErrorMessage = "请输入房源地址")]
public string houseaddr { get; set; }
[Required(ErrorMessage = "请输入房源状态")]
public int housestatus { get; set; }
}
#endregion
第二步:封装企业库验证方法,接收要验证对象以及是全部验证还是只验证部分列或不验证部分列。
1 #region 校验模型
2 /// <summary>
3 ///
4 /// </summary>
5 /// <typeparam name="T">要校验的类</typeparam>
6 /// <param name="t">要校验的对象</param>
7 /// <param name="excludecols">不需要较验的列</param>
8 /// <returns>string[]{ 成功=Y/失败=列ID,成功没有/失败为错误信息 }</returns>
9 protected string[] CheckModel<T>(T t, CheckMode Check= CheckMode.校验全部, IList<string> cols = null) where T:class
10 {
11 ModelBindingContext modelcontext = new ModelBindingContext();
12 modelcontext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(T));
13 modelcontext.ModelMetadata.Model = t;
14 //modelcontext.ModelName = "hs_HouseKeyLog";
15
16 var factory = ValidationFactory.CreateValidator(modelcontext.Model.GetType());
17 var results = factory.Validate(modelcontext.Model);
18 if (results.IsValid) return new string[] { "Y" };
19 if (Check == CheckMode.校验全部) return new string[] { results.First().Key.ToLower(), results.First().Message };
20 string[] resultarray = null;
21 foreach (Microsoft.Practices.EnterpriseLibrary.Validation.ValidationResult vr in results)
22 {
23 if( Check == CheckMode.校验排除)
24 if (cols.First(p => p.ToLower() == vr.Key.ToLower()).Count() > 0) continue;
25 else
26 if (cols.First(p => p.ToLower() != vr.Key.ToLower()).Count() > 0) continue;
27 resultarray = new string[] { vr.Key, vr.Message };
28 break;
29 }
30 return resultarray;
31 }
32 #endregion
第三步:调用
string[] checkmodel = new string[1];
hs_House newhouse = JsonHelper.JsonDeserialize<hs_House>(Parm.JosnParm);
checkmodel = base.CheckModel<hs_House>(newhouse);
if (checkmodel[0] != "Y") return base.SendClientMessage(SaveStatus.error, checkmodel[0], checkmodel[1]);
//checkmode[0]若不为"Y",则它就为错误的列同时checkmodel[1]为错误信息