zoukankan      html  css  js  c++  java
  • 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]为错误信息

  • 相关阅读:
    jq focus 在火狐(Firefox)下无效
    将自己的项目上传到github保管
    $(window).height(),在火狐下面获取的高度并不是可视区域的高度
    [转载]跨域iframe高度自适应
    用css改变默认的checkbox样式
    js,jq新增元素 ,on绑定事件无效
    xshell配色Solarized Dark
    记一次给公司服务器装第二块硬盘的经历
    【shell编程基础3】shell编程的组合应用之二:管道及其命令
    【shell编程基础2】shell组合应用之一:重定向和逻辑
  • 原文地址:https://www.cnblogs.com/doclaim/p/2130280.html
Copyright © 2011-2022 走看看