码迷,mamicode.com
首页 > Web开发 > 详细

期货大赛项目|四,MVC的数据验证

时间:2018-06-21 17:30:21      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:future   不能   off   put   append   href   .data   sheet   esc   

上图先看下效果

技术分享图片

样式先不说,先了解下数据验证是怎么实现的

一 必须是强类型的视图

二 这些显示提示的话语,都在强类型的实体中

三 必须使用Html.BeginForm或者Html.AjaxBeginForm

四 提交方式必须是form的submit

上代码

技术分享图片
@model FuturesContest.ViewModel.User.UserViewModel
@{
    Layout = null;
}

<!DOCTYPE html>

<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <!-- Meta, title, CSS, favicons, etc. -->
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>期货大赛管理后台登录! | </title>
    <!-- Bootstrap -->
    <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
    <!-- Font Awesome -->
    <link href="~/Content/vendors/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
    <!-- NProgress -->
    <link href="~/Content/vendors/nprogress/nprogress.css" rel="stylesheet">
    <!-- Animate.css -->
    <link href="~/Content/vendors/animate.css/animate.min.css" rel="stylesheet">
    <!--poshytip.css-->
    <link href="~/Content/vendors/poshytip-1.2/src/tip-yellow/tip-yellow.css" rel="stylesheet" />
    <!-- Custom Theme Style -->
    <link href="~/Content/Gentelella/custom.min.css" rel="stylesheet" />
</head>
<body class="login">
<div>
    <a class="hiddenanchor" id="signup"></a>
    <a class="hiddenanchor" id="signin"></a>
    <div class="login_wrapper">
        <div class="animate login_form">
            <section class="login_content">
                @{
                    Html.EnableClientValidation();
                }
                @using (Html.BeginForm("Index", "Login", FormMethod.Post))
                {
                    <h1>期货大赛管理后台</h1>
                    <div>
                        @Html.TextBoxFor(m => m.Account, new {@class = "form-control", placeholder = "用户名", autocomplete="off"})
                        @Html.ValidationMessageFor(m => m.Account)
                    </div>
                    <div>
                        @Html.PasswordFor(m => m.Password, new {@class = "form-control", placeholder = "密码", autocomplete = "off" })
                        @Html.ValidationMessageFor(m => m.Password)
                    </div>
                    <div>
                        <a id="sub_login" class="btn btn-default submit">登 录</a>
                    </div>
                    <div class="clearfix"></div>
                }
            </section>
        </div>
    </div>
</div>
</body>
</html>
<script src="~/Scripts/jquery-1.9.1.min.js"></script>
<script src="~/Scripts/bootstrap.min.js"></script>
<script src="~/Content/vendors/poshytip-1.2/src/jquery.poshytip.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/common.js"></script>
<script type="text/javascript">
    $("#sub_login").click(function() {
        $("form").submit();
    });

    document.onkeydown = function() {
        if (event.keyCode === 13) {
            $("form").submit();
        }
    }
</script>
View Code
          @{
                    Html.EnableClientValidation();
                }

启动客户端验证

@using (Html.BeginForm("Index", "Login", FormMethod.Post))

benginForm提交

               @Html.TextBoxFor(m => m.Account, new {@class = "form-control", placeholder = "用户名", autocomplete="off"})
                        @Html.ValidationMessageFor(m => m.Account)
ValidationMessageFor错误信息会显示在这里
<script src="~/Scripts/jquery-1.9.1.min.js"></script>
<script src="~/Scripts/bootstrap.min.js"></script>
<script src="~/Content/vendors/poshytip-1.2/src/jquery.poshytip.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/common.js"></script>

千万不要忘记unobtrusive.js


 

后台

[HttpPost]
        public ActionResult Index(UserViewModel user)
        {
            var model = user.ToEntity();

            if (!_bll.IsRightPassword(model))
                ModelState.AddModelError("Password", "密码错误或该用户被禁用");
            if (!ModelState.IsValid)
                return View(user);

            //登录成功,将登录信息存入session
            var loginInfo = _bll.GetUserByAccount(model.Account);
            Session["LoginInfo"] = loginInfo;
            //将登录信息存储到cookies
            _bll.SaveCookie(loginInfo);

            return RedirectToAction("Index", "Back");
        }

ModelState.AddModelError 可以添加一个错误信息

ModelState.IsValid 表示所有数据通过验证

 

在看看viewModel验证的几种类型

技术分享图片
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace FuturesContest.ViewModel.User
{
    public class UserAddViewModel
    {
        public int Id { get; set; }

        [DisplayName("用户名")]
        [Required(ErrorMessage = "{0}不能为空")]
        [Remote("CheckAccount", "Back", ErrorMessage = "{0}已存在")]
        public string Account { get; set; }

        [DisplayName("密码")]
        [Required(ErrorMessage = "{0}不能为空")]
        [RegularExpression(@"^[0-9A-Za-z]{6,20}$",ErrorMessage = "{0}格式为6-20位字母或数字")]
        public string Password { get; set; }

        [DisplayName("昵称")]
        [Required(ErrorMessage = "{0}不能为空")]
        [Remote("CheckNickName", "Back", ErrorMessage = "{0}已存在")]
        public string NickName { get; set; }

        [DisplayName("有效状态")]
        public int IsEnabled { get; set; }

        [DisplayName("创建时间")]
        public DateTime AddTime { get; set; }

        [DisplayName("最后登录时间")]
        public DateTime LastTime { get; set; }

        [DisplayName("头像")]
        public string HeadThumb { get; set; }

        [DisplayName("排序")]
        [Required(ErrorMessage = "{0}不能为空")]
        [Range(0, 99, ErrorMessage="{0}取值范围为0-99")]
        public int OrderId { get; set; }
    }
}
View Code

DisplayName-------------- 在用labelFor的时候,会显示后面的名称

[Required(ErrorMessage = "{0}不能为空")] ------------非空验证

[Remote("CheckAccount", "Back", ErrorMessage = "{0}已存在")] ---------Ajax验证,需要后台有一个CheckAccount的方法

[RegularExpression(@"^[0-9A-Za-z]{6,20}$",ErrorMessage = "{0}格式为6-20位字母或数字")]----------正则验证

[Range(0, 99, ErrorMessage="{0}取值范围为0-99")]------------范围验证

 

ajax验证的案例

     //Ajax验证用户名是否存在
        public JsonResult CheckAccount(string account)
        {
            var result = _bll.ExistAccount(account);
            return Json(result, JsonRequestBehavior.AllowGet);
        } 

返回的一定是一个布尔值,才能知道是否通过

 


 

好啦!现在应该已经可以正常的显示数据验证的错误信息了!但样式不好看,所以我们要修改样式

我用的是poshytip插件,类似于tips的插件

引入对应的css和js

 

修改源码

找到jquery.validate.unobtrusive.js

找到function onError(error, inputElement)函数,稍微改改就可以 我贴个全的

function onError(error, inputElement) {  // ‘this‘ is the form element
        var container = $(this).find("[data-valmsg-for=‘" + escapeAttributeValue(inputElement[0].name) + "‘]"),
            replaceAttrValue = container.attr("data-valmsg-replace"),
            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
        //------为container添加tips样式 start--------
        var $customErrorTip = container.attr("data-forerrortip");
        //------为container添加tips样式 end----------
        container.removeClass("field-validation-valid").addClass("field-validation-error");
        error.data("unobtrusiveContainer", container);
        //-----添加提示消息 start -------
        var elem = $("#" + inputElement[0].name.replace(".", "_"));
        //-----添加提示消息 end ---------
        if (replace) {
            container.empty();
            //add start
            if (error.html() != "") {
                if ($customErrorTip) {
                    $("#" + $customErrorTip).poshytip("destroy");
                } else {
                    elem.poshytip("destroy");
                }
                var direction = "right";
                //左边+元素宽+提示的文字+提示两边的空白
                if ((elem[0].offsetLeft + elem.width() + error.length * 10 + 20) > $(document).width()) {
                    direction = "left";
                }
                var errorConfig = {
                    content: error,
                    alignTo: ‘target‘,
                    alignX: direction,
                    alignY: ‘center‘,
                    showOn: ‘none‘,
                    bgImageFrameSize: 7,
                    offsetX: 5
                };
                if ($customErrorTip) {
                    $("#" + $customErrorTip).poshytip(errorConfig).poshytip(‘show‘);
                } else {
                    elem.filter(‘:not(.valid)‘).poshytip(errorConfig).poshytip(‘show‘);
                }
            } else {
                if ($customErrorTip) {
                    $("#" + $customErrorTip).poshytip("destroy");
                } else {
                    elem.poshytip("destroy");
                }
            }
            //add end
            //error.removeClass("input-validation-error").appendTo(container);
        }
        else {
            error.hide();
        }
    }

这样我们就解决了通过微软的这个js进行前端验证的样式修改

注意:这种验证没有到服务器验证,只是JS拦截

 

但!!!!还是不够,Ajax方法的后台验证样式并不通过这个js,它是后端验证,直接返回到前端的

所以我封装了一个js,捕获返回的数据进行修改

common,js

技术分享图片
$(function () {
    $(".field-validation-error").each(function () {
        var $this = $(this);
        var thisid = $this.attr("data-valmsg-for").replace(".", "_");
        var direction = "right";
        // 左边+元素宽+提示的文字+提示两边的空白
        if (($this[0].offsetLeft + $this.width() + $this.text().length * 10 + 20) > $(document).width()) {
            direction = "left";
        }
        $this.hide();

        setTimeout(function () {
            $("#" + thisid).poshytip({
                content: $this.text(),
                alignTo: ‘target‘,
                alignX: direction,
                alignY: ‘center‘,
                showOn: ‘none‘,
                offsetX: 5
            }).poshytip(‘show‘);
        }, 100);

    });
});
View Code

到这时,我们才完成了MVC的数据验证!!!

 

 

 

 

 

期货大赛项目|四,MVC的数据验证

标签:future   不能   off   put   append   href   .data   sheet   esc   

原文地址:https://www.cnblogs.com/tanfuchao/p/9209342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!