MVC中的统一验证机制~续

简介:

前段时间我发表的关于MVC架构中对验证方式的设计,收到了不少朋友的留言,意思是说过于复杂,复用性不高,当然我的出发点是减少实体部门的代码量。

最近在朋友的建议下,看了另一种验证方式,事实上就是MVC实例中提供的实体属性验证方式,为每个视图加一个视图模型,对视图模型中的属性进行特性的

约束即可。具体如下:

WEB UI可能是这样

<%using (Html.BeginForm())
      {  %>
    <%=Html.LabelFor(model=>model.Name) %>
    <%=Html.TextBoxFor(model=>model.Name) %>
    <%=Html.ValidationMessageFor(model=>model.Name) %>
    <%=Html.LabelFor(model=>model.Age) %>
    <%=Html.TextBoxFor(model => model.Age)%>
    <%=Html.ValidationMessageFor(model => model.Age)%>
    <input type="submit" value="Save" />
    <%} %>

Model可能是这样

namespace Web.Models
{
    public class PersonModels
    {
        [Required("RequiredField", "Name")]
        public string Name { get; set; }
        [Range(18, int.MaxValue, "GreaterThan", "Age", 18)]
        public int Age { get; set; }
        [Range(int.MinValue, 160, "LessThan", "Weight", 160)]
        public double Weight { get; set; }
        [Required("EmailField", "Email")]
        [Email("EmailField", "Email")]
        public string Email { get; set; }
    }
}

而controller可能是这样

[HttpPost]
        public ActionResult Index(FormCollection form)
        {
            if (this.ModelState.IsValid)
            {
                // 验证通过的逻辑
                Response.Output.Write("<script>alert('验证通过');</script>");
            }
            return View();
        }

最后实体具一类可能是这样

namespace Web.Mvc.Extensions
{
    /// <summary>
    /// 通用验证基类
    /// </summary>
    public abstract class EntityValidationAttribute : ValidationAttribute
    {
        public EntityValidationAttribute(string messageId, params object[] args) :
            base(() => MessageManager.Current.GetMessage(messageId, args)) { }

        #region Protected Property
        protected Regex rLetters { get { return new Regex("[a-zA-Z]{1,}"); } }
        /// <summary>
        /// 验证数字
        /// </summary>
        protected Regex rDigit { get { return new Regex("[0-9]{1,}"); } }
        /// <summary>
        /// 验证邮编
        /// </summary>
        protected Regex rPostNumber { get { return new Regex("^[0-9]{3,14}$"); } }
        /// <summary>
        /// 验证手机
        /// </summary>
        protected Regex rMobile { get { return new Regex(@"^1[3|4|5|8][0-9]\d{8}$"); } }
        /// <summary>
        /// 验证电话
        /// </summary>
        protected Regex rTelePhone { get { return new Regex(@"^[0-9]{2,4}-\d{6,8}$"); } }
        /// <summary>
        /// 验证传真
        /// </summary>
        protected Regex rFex { get { return new Regex(@"/^[0-9]{2,4}-\d{6,8}$"); } }
        /// <summary>
        /// 验证Email
        /// </summary>
        protected Regex rEmail { get { return new Regex(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); } }
        #endregion

    }
    /// <summary>
    /// 为空验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class RequiredAttribute : EntityValidationAttribute
    {
        public bool AllowEmptyStrings { get; set; }
        public RequiredAttribute(string messageId, params object[] args) :
            base(messageId, args)
        { }
        public override bool IsValid(object value)
        {
            return new System.ComponentModel.DataAnnotations.RequiredAttribute { AllowEmptyStrings = this.AllowEmptyStrings }.IsValid(value);
        }
    }
    /// <summary>
    /// 范围验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class RangeAttribute : EntityValidationAttribute
    {
        private System.ComponentModel.DataAnnotations.RangeAttribute innerRangeAttribute;

        public RangeAttribute(double minimum, double maximum, string messageId, params object[] args) :
            base(messageId, args)
        {
            innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
        }

        public RangeAttribute(int minimum, int maximum, string messageId, params object[] args) :
            base(messageId, args)
        {
            innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(minimum, maximum);
        }

        public RangeAttribute(Type type, string minimum, string maximum, string messageId, params object[] args) :
            base(messageId, args)
        {
            innerRangeAttribute = new System.ComponentModel.DataAnnotations.RangeAttribute(type, minimum, maximum);
        }

        public override bool IsValid(object value)
        {
            return innerRangeAttribute.IsValid(value);
        }
    }

    /// <summary>
    /// Email验证
    /// </summary>
    [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    public class EmailAttribute : EntityValidationAttribute
    {
        public EmailAttribute(string messageId, params object[] args) :
            base(messageId, args)
        { }
        public override bool IsValid(object value)
        {
            if (value == null)
                return false;
            else
                return rEmail.IsMatch(value.ToString());
        }
    }

    /// <summary>
    /// 消息类
    /// </summary>
    public class MessageManager
    {
        static Dictionary<string, string> messages = new Dictionary<string, string>();
        static MessageManager()
        {
            messages.Add("RequiredField", "这个 \"{0}\"字段是必填的!");
            messages.Add("GreaterThan", "这个 \"{0}\" 字段的值必须大于 \"{1}\"!");
            messages.Add("LessThan", "这个 \"{0}\" 字段的值必须小于 \"{1}\"!");
            messages.Add("EmailField", "这个 \"{0}\" 字段不是有效的Email地址!");

        }
        /// <summary>
        /// 得到验证异常的消息集合
        /// 对外公开
        /// </summary>
        /// <param name="messageId">异常消息ID</param>
        /// <param name="args">消息参数集合</param>
        /// <returns></returns>
        public string GetMessage(string messageId, params object[] args)
        {
            return string.Format(CultureInfo.CurrentCulture, messages[messageId], args);
        }
        /// <summary>
        /// 本类的实例对象
        /// </summary>
        public static MessageManager Current = new MessageManager();
    }
}

本文转自博客园张占岭(仓储大叔)的博客,原文链接:MVC中的统一验证机制~续,如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
存储 前端开发 Java
Spring MVC 中的数据绑定和验证机制是什么,如何使用
Spring MVC 中的数据绑定和验证机制是什么,如何使用
|
前端开发 .NET 数据安全/隐私保护
菜鸟入门【ASP.NET Core】15:MVC开发:ReturnUrl实现、Model后端验证 、Model前端验证
ReturnUrl实现 我们要实现returnUrl,我们需要在注册(Register)方法中接收传进的returnUrl并给它默认值null,然后将它保存在ViewData里面 然后我们定义一个内部方法来判断跳转returnUrl //内部跳转 private IActionR...
2445 0
|
10月前
|
前端开发 Java Spring
《Spring MVC》 第八章 拦截器实现权限验证、异常处理
《Spring MVC》 第八章 拦截器实现权限验证、异常处理
152 0
|
前端开发 JavaScript API
NET MVC第七章、jQuery插件验证
NET MVC第七章、jQuery插件验证
152 0
NET MVC第七章、jQuery插件验证
|
前端开发 数据库 计算机视觉
关于MVC中模型model的验证问题
关于MVC中模型model的验证问题
121 0
关于MVC中模型model的验证问题
|
索引
MVC3权限验证,诡异的OnAuthorization
mvc3权限验证 protected override void OnAuthorization(AuthorizationContext filterContext) { if (//开始权限验证返回bool) { filterContext.
1074 0
|
前端开发
4.ASP.NET全栈开发之在MVC中使用服务端验证(二)
首先声明,这篇博文是完善.ASP.NET全栈开发之在MVC中使用服务端验证 的,所以重复内容,我就不过多的阐述,很多问题都是在实践中去发现,然后再去完善,这篇博文也一样,建立在已阅 “.ASP.NET全栈开发之在MVC中使用服务端验证” 的基础上。
1219 0
|
前端开发 UED .NET
2.ASP.NET全栈开发之在MVC中使用服务端验证
上一章我们在控制台中基本的了解了FluentValidation是如何简洁,优雅的完成了对实体的验证工作,今天我们将在实战项目中去应用它。 首先我们创建一个ASP.NET MVC项目,本人环境是VS2017, 创建成功后通过在Nuget中使用 Install-Package FluentValidation -Version 7.
1106 0
|
前端开发 数据安全/隐私保护
net MVC中的模型绑定、验证以及ModelState
net MVC中的模型绑定、验证以及ModelState 模型绑定 模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。
1653 0
|
前端开发 .NET 开发框架