010. 使用微软提供的校验插件

后台类代码:(注意看此类上面的提示, 此类是自动生成的, 这种方法打特性(标签)的话, 再生成一次就会被覆盖, 解决方法, 会放到后面介绍)

//------------------------------------------------------------------------------
// <auto-generated>
//    此代码是根据模板生成的。
//
//    手动更改此文件可能会导致应用程序中发生异常行为。
//    如果重新生成代码,则将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------

namespace MvcCRUDDemo
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;

    public partial class OrderInfo
    {
        //使用微软提供的校验插件, 微软提供了四种类型的校验
        //1. 字符串长度校验; 2. 非空校验(必填项); 3. 范围校验; 4. 正则表达式
        //分别如下

        [Required(ErrorMessage ="*")] //非空校验
        public int Id { get; set; }

        //字符串长度校验
        [StringLength(5, ErrorMessage = "请输入2~5个字符", MinimumLength = 2)]
        [Required(ErrorMessage = "*")]
        public string BookName { get; set; }

        [Range(18,120,ErrorMessage ="数字必须在18~120之间")] //范围校验
        [RegularExpression(@"")] //邮箱格式字符串
        public string BookAuth { get; set; }
        public int UserInfo_Id { get; set; }
    
        public virtual UserInfo UserInfo { get; set; }
    }
}

 前台使用的时候的代码:

<head>
    <meta name="viewport" content="width=device-width" />
    <script src="~/Scripts/jquery-1.8.0.js"></script>
    <script src="~/Scripts/jquery.validate.js"></script>
    @*需要引入隐式的验证js文件, 当然请注意, 这种方法也就是在使用Html.的时候, 才会去校验, 而在
    使用原生的手写的<input name="BookName" /> 的这种标签, 是不会进行校验的*@
    <script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
@*其实关键就是添加一个隐式的引用的js, 下面的代码都是自动生成的*@
    <title>Create</title>
</head>
<body>
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()

        <div class="form-horizontal">
            <h4>OrderInfo</h4>
            <hr />
            @Html.ValidationSummary(true, "", new
       {
           @class = "text-danger"
       })
            <div class="form-group">
                @Html.LabelFor(model => model.BookName, htmlAttributes: new
           {
               @class = "control-label col-md-2"
           })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.BookName, new
               {
                   htmlAttributes = new
                   {
                       @class = "form-control"
                   }
               })
                    @Html.ValidationMessageFor(model => model.BookName, "", new
               {
                   @class = "text-danger"
               })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.BookAuth, htmlAttributes: new
           {
               @class = "control-label col-md-2"
           })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.BookAuth, new
               {
                   htmlAttributes = new
                   {
                       @class = "form-control"
                   }
               })
                    @Html.ValidationMessageFor(model => model.BookAuth, "", new
               {
                   @class = "text-danger"
               })
                </div>
            </div>

            @*<div class="form-group">
                    @Html.LabelFor(model => model.UserInfo_Id, "UserInfo_Id", htmlAttributes: new { @class = "control-label col-md-2" })
                    <div class="col-md-10">
                       @Html.DropDownList("UserInfo_Id", null, htmlAttributes: new { @class = "form-control" })
                        @Html.ValidationMessageFor(model => model.UserInfo_Id, "", new { @class = "text-danger" })
                    </div>
                </div>*@

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Create" class="btn btn-default" />
                </div>
            </div>
        </div>
    }

    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
</body>
</html>

 效果:

生成的源码截图:

 

修改提示字符为红色, 上图已经标识出提示处使用的<span>标签使用的样式文件了, 所以只需要针对性的添加即可, 其实也可以修改该样式:

<head>
    <meta name="viewport" content="width=device-width" />
    <script src="~/Scripts/jquery-1.8.0.js"></script>
    <script src="~/Scripts/jquery.validate.js"></script>
    @*需要引入隐式的验证js文件, 当然请注意, 这种方法也就是在使用Html.的时候, 才会去校验, 而在
    使用原生的手写的<input name="BookName" /> 的这种标签, 是不会进行校验的*@
    <script src="~/Scripts/jquery.validate.unobtrusive.js"></script>

    <title>Create</title>
    <style type="text/css">
        /*验证都是红色, 所以更改验证后文本的提示颜色, 这只是一个思路*/
        .field-validation-eror {
            color:red;
        }
    </style>
</head>

 效果:

后台校验代码:

        public ActionResult Create()
        {
            //MVC自己会处理校验, 也就是说在MVC中 , 校验是前台后台使用同样一种方式进行, 可以看下微软自动生成的代码, 也是这样写的
            if (ModelState.IsValid)
            {

            }
            return View();
        }

 使用部分类(伙伴类), 解决特性被冲掉的可能性, 在MVC5中好像已经不会被冲掉了, 但是我也不确定, 下面的操作还是针对OrderInfo类来操作:

新建一部分类(伙伴类), 当然类名也叫OrderInfo了:

自动生成的类现在代码如下:

部分类(伙伴类)的代码如下, 一定要保证在同一个命名空间下:

namespace MvcCRUDDemo
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    //这个类下面是空的, 然后在这个类上面打上标签, 这个标签的意思就是使得OrderInfo这个类拥有两个类的元数据信息, 所以说, 现在的OrderInfo不仅有自己的元数据信息, 还有OrderInfoValidate的元数据信息; 返回头把另外一个OrderInfo中的元数据删除试试看
    [MetadataType(typeof(OrderInfoValidate))]
    public partial class OrderInfo
    {
       
    }

    /// <summary>
    /// 以后就是用这个类进行验证, 注意此类中字段名一定要和OrderInfo中的字段名保持一致
    /// </summary>
    public class OrderInfoValidate {
        //使用微软提供的校验插件, 微软提供了四种类型的校验
        //1. 字符串长度校验; 2. 非空校验(必填项); 3. 范围校验; 4. 正则表达式
        //分别如下

        [Required(ErrorMessage = "*")] //非空校验
        public int Id
        {
            get; set;
        }

        //字符串长度校验
        [StringLength(5, ErrorMessage = "请输入2~5个字符", MinimumLength = 2)]
        [Required(ErrorMessage = "*")]
        public string BookName
        {
            get; set;
        }

        [Range(18, 120, ErrorMessage = "数字必须在18~120之间")] //范围校验
        [RegularExpression(@"^\s*([A-Za-z0-9_-]+(\.\w+)*@(\w+\.)+\w{2,5})\s*$")] //邮箱格式字符串
        public string BookAuth
        {
            get; set;
        }
        public int UserInfo_Id
        {
            get; set;
        }

        public virtual UserInfo UserInfo
        {
            get; set;
        }
    }

 运行一下效果还是和之前的一样, 但是这样就不担心在自动生成的时候, 冲掉特性标签了

 

posted on 2017-02-18 14:55  印子  阅读(178)  评论(0编辑  收藏  举报

导航