zoukankan      html  css  js  c++  java
  • MVC3学习第十四章 佟掌柜第三弹——MVC3下利用陕北吴旗娃的验证码控件实现验证码功能以及在mvc3下使用编辑器

    本章学习内容

    1.利用陕北吴旗娃的验证码控件实现验证码功能

    2.利用kindeditor编辑器实现mvc3下的编辑器功能

     验证码是软件或网站中比较常用的一种功能,无论是对于房租恶意注册登录还是刷票,灌水之类的,都有很大的作用,在webform里我们可以利用第三方控件很方便的实现这个功能,当然自己手写一个生成验证码的类也不是太难,今天我们介绍一个在mvc3下实现验证码的控件,毕竟是能简单一点对于自己编码来说是最好的。控件和上一章的分页控件来自同一个地方,在上一章提及的官网也可以下载到,或者点此下载验证码控件

    下载验证码控件dll后,请添加引用到项目

    修改UserInfo/Login.cshtml完整源代码如下:

    @using Webdiyer.WebControls.Mvc
    @model MyShopTest.Models.UserInfo
    @{
        ViewBag.Title = "用户登录";
        Layout = "~/Views/Shared/MyMaster.cshtml";
    }
    <h2>
        用户登录</h2>
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    <p>
        没有有帐号,<a href="Register">点此</a>注册
    </p>
    @using (Html.BeginForm())
    {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>用户登录</legend>
            <div class="editor-label">
                @Html.LabelFor(model => model.UserName)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.UserName)
                @Html.ValidationMessageFor(model => model.UserName)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.UserPwd)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(model => model.UserPwd)
                @Html.ValidationMessageFor(model => model.UserPwd)
            </div>
            <div class="editor-label">
                验证码:
            </div>
            <div class="editor-field">
                @Html.Raw(Html.MvcCaptcha(new MvcCaptchaOptions { ValidationInputBoxId = "captchaTextBox", CaptchaImageContainerId = "captchaImage", ReloadLinkText = "看不清?换一张" ,Width=100,Height=30}))
                <span id="captchaImage"></span>
                <br />
               
                <input type="text" name="captchaTextBox" id="captchaTextBox" />
            </div>
            <p>
                <input type="submit" value="登录" />
            </p>
        </fieldset>
    }

    我们来解析一下代码:

    @Html.Raw(Html.MvcCaptcha(new MvcCaptchaOptions { ValidationInputBoxId = "captchaTextBox", CaptchaImageContainerId = "captchaImage", ReloadLinkText = "看不清?换一张" ,Width=100,Height=30}))

    此段代码是用来创建验证码的,new MvcCaptchaOptions 表示初始化验证码设置项,依次是输入验证码的文本框id,包含验证码图片控件的父容器的客户端Id(ajax加载时用到,此处不涉及),刷新验证码的提示文本,验证码的高,宽,至于验证码的最外围,我们使用了Html.Raw是为了让验证码控件不被mvc进行html编码,原样输出html代码,否则我们只能看到是经过html编码后的字符串

    修改UserInfo控制器里的Login的Action,代码如下:

     /// <summary>
            /// 登录处理
            /// </summary>
            /// <returns></returns>
            [HttpPost]
            [AcceptVerbs(HttpVerbs.Post), ValidateMvcCaptcha("captchaTextBox")]
            public ActionResult Login(string UserName, string UserPwd)
            {
                bool isOk = ModelState.IsValid;//会加入验证码验证
                var user = new UserInfo();
                if (!isOk)
                {
                    user.UserName = UserName;
                    user.UserPwd = UserPwd;
                    ModelState.AddModelError("", "验证码错误!");
                    return View(user);
                }
                 user = db.UserInfos.SingleOrDefault(u => u.UserName == UserName && u.UserPwd == UserPwd);
                if (user != null)
                {
                    Session["User"] = user;
                    return RedirectToAction("Index");
                }
                else
                {
                    user = new UserInfo();
                    user.UserName = UserName;
                    user.UserPwd = UserPwd;
                    ModelState.AddModelError("", "用户名或密码错误!");
                    return View(user);
                }
    
            }

    代码略作解释:

    [AcceptVerbs(HttpVerbs.Post), ValidateMvcCaptcha("captchaTextBox")]

    此段代码表示让这个Action进行验证码验证,验证内容来自于captchaTextBox,ModelState.IsValid会将我们的验证码对比一并加入进去,我们只需要知道ModelState.IsValid是否通过即可

    重新编译项目,运行:

    已经可以实现我们的验证码功能,当然这个验证码控件比我们目前使用的要强大的多,大家可以自行钻研实验一下。

    2.利用kindeditor实现mvc3下的编辑器功能

     之前的代码里我们实现了商品管理的增删改查,但是对于商品来说还缺少一个最重要的介绍功能,商品的介绍来所含信息丰富而且重要,可能会出现图片,文字,视频,表格等内容,为了适应这一需求,所见即所得的编辑器自然是最好的选择,在此系列教程中,我们使用kindeditor编辑器来实现,版本为4.1.5,可以点此下载,也可以去官网http://www.kindsoft.net/下载

    下载后请添加dll引用,修改Models/Product.cs完整代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    
    namespace MyShopTest.Models
    {
        public class Product
        {
            public int Id { get; set; }
            [Display(Name = "商品名称")]
            [Required(ErrorMessage = "必须输入名称!")]
            public string Title { get; set; }
            [Display(Name = "价格")]
            [Required(ErrorMessage = "必须输入价格!")]
            [Range(0.01, 1000, ErrorMessage = "输入的价格必须是0.01到1000")]
            public double Price { get; set; }
    
            [Display(Name = "图片")]
            public string ImgUrl { get; set; }
            //类别Id
            public int CategoryId { get; set; }
            [Display(Name="描述")]
            public string Description { get; set; }
            private DateTime addTime;
            [Display(Name = "添加时间")]
            [Required()]
            public DateTime AddTime
            {
                get
                {
                    if (addTime == null)
                    {
                        return DateTime.Now;
                    }
                    return addTime;
                }
                set { addTime = value; }
            }
            //类别实体(主外键)
            public virtual Categeory Category { get; set; }
        }
    }

    修改InitData.cs完整代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data.Entity;
    using System.Data.Entity.Validation;
    
    namespace MyShopTest.Models
    {
        public class InitData : DropCreateDatabaseIfModelChanges<MyShopDataEntities>
        {
            //实体发生改变时,重新创建数据库,首次也会运行此处
            protected override void Seed(MyShopDataEntities context)
            {
                try
                {
    
                    //初始化数据
                    var users = new List<UserInfo>
                {
                     new UserInfo { UserName = "admin",UserPwd="admin",AddTime=DateTime.Now,Email="Qq@qq.com",Phone="13112345678" },
                     new UserInfo { UserName = "zhangsan",UserPwd="admin",AddTime=DateTime.Now,Email="Qq@qq.com",Phone="13112345678" },
                     new UserInfo { UserName = "lisi",UserPwd="admin",AddTime=DateTime.Now,Email="Qq@qq.com",Phone="13112345678" }
                   
                };
                    users.ForEach(user => context.UserInfos.Add(user));
                    //类别数据
                    var categorys = new List<Categeory>();
                    categorys.Add(new Categeory { Name = "食品" });
                    categorys.Add(new Categeory { Name = "宠物" });
                    //产品数据
                    var products = new List<Product>
                    {
                        new Product{ AddTime=DateTime.Now,Category=categorys.Find(delegate(Categeory c){return c.Name=="食品"; }), ImgUrl="0", Price=8.8, Title="冰淇淋",Description="暂无描述"},
                         new Product{ AddTime=DateTime.Now,Category=categorys.Single(c=>c.Name=="宠物"), ImgUrl="0", Price=88.8, Title="大熊猫",Description="暂无描述"},
                         new Product{ AddTime=DateTime.Now,Category=categorys.Single(c=>c.Name=="宠物"), ImgUrl="0", Price=88.8, Title="北极熊",Description="暂无描述"}
                    };
                    products.ForEach(p => context.Products.Add(p));
    
                }
                catch (DbEntityValidationException dbEx)
                {
                    string a = dbEx.Message;
                }
    
            }
        }
    }

    修改Product/Create.cshtml完整代码如下:

    @model MyShopTest.Models.Product
    @{
        ViewBag.Title = "商品添加";
    }
    <h2>
        商品添加</h2>
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    <script src="../../kindeditor/kindeditor-all-min.js" type="text/javascript"></script>
    <script type="text/javascript">
        KindEditor.ready(function (K) {
            var editor1 = K.create('#Description', {
                cssPath: '../../kindeditor/plugins/code/prettify.css',
                uploadJson: '/tools/upload_json.ashx',
                fileManagerJson: '/tools/file_manager_json.ashx',
                allowFileManager: true
            });
        });
    </script>
    @using (Html.BeginForm("Create", "Product", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
    @*@Html.ValidationSummary(true)*@
        @Html.ValidationMessage("error")
        <fieldset>
            <legend>商品添加</legend>
            <div class="editor-label">
                @Html.LabelFor(model => model.Title)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Title)
                @Html.ValidationMessageFor(model => model.Title)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Price)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Price)
                @Html.ValidationMessageFor(model => model.Price)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.ImgUrl)
            </div>
            <div class="editor-field">
                <input type="file" name="filImgs" />
                <input type="hidden" name="ImgUrl" value="0" />
                @Html.ValidationMessageFor(model => model.ImgUrl)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.CategoryId, "类别")
            </div>
            <div class="editor-field">
                @Html.DropDownList("CategoryId")
                @Html.ValidationMessageFor(model => model.CategoryId)
                @Html.Hidden("AddTime", DateTime.Now)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Description)
            </div>
            <div class="editor-field">
                @Html.TextAreaFor(model => model.Description, 15, 100, null)
            </div>
            <p>
                <input type="submit" value="添加" />
            </p>
        </fieldset>
    }
    <div>
        @Html.ActionLink("返回列表", "Index")
    </div>

    修改Edit.cshtml完整代码如下:

    @model MyShopTest.Models.Product
    @{
        ViewBag.Title = "商品编辑";
    }
    <h2>
        商品编辑</h2>
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    <script src="../../kindeditor/kindeditor-all-min.js" type="text/javascript"></script>
    <script type="text/javascript">
        KindEditor.ready(function (K) {
            var editor1 = K.create('#Description', {
                cssPath: '../../kindeditor/plugins/code/prettify.css',
                uploadJson: '/tools/upload_json.ashx',
                fileManagerJson: '/tools/file_manager_json.ashx',
                allowFileManager: true
            });
        });
    </script>
    @using (Html.BeginForm("Edit", "Product", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>商品编辑</legend>
            @Html.HiddenFor(model => model.Id)
            <div class="editor-label">
                @Html.LabelFor(model => model.Title)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Title)
                @Html.ValidationMessageFor(model => model.Title)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Price)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Price)
                @Html.ValidationMessageFor(model => model.Price)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.ImgUrl)
            </div>
            <div class="editor-field">
               <input type="file" name="filImgs"/>
               <input type="hidden" name="ImgUrl" value="@Model.ImgUrl"/>
                @Html.ValidationMessageFor(model => model.ImgUrl)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.CategoryId, "类别")
            </div>
            <div class="editor-field">
                @Html.DropDownList("CategoryId")
                @Html.ValidationMessageFor(model => model.CategoryId)
            </div>
           <div class="editor-label">
                @Html.LabelFor(model => model.Description)
            </div>
            <div class="editor-field">
                @Html.TextAreaFor(model => model.Description, 15, 100, null)
            </div>
            <p>
                <input type="submit" value="保存" />
            </p>
        </fieldset>
    }
    <div>
        @Html.ActionLink("返回列表", "Index")
    </div>

    修改Details完整代码如下:

    @model MyShopTest.Models.Product
    @{
        ViewBag.Title = "商品详细";
        Layout = "~/Views/Shared/MyMaster.cshtml";
    }
    <h2>
        商品详细</h2>
    <fieldset>
        <legend>商品详细</legend>
        <div style="margin: 0 auto;">
            <img src="@Model.ImgUrl" width="300px" height="200px"/>
            <br />
            <ul>
                <li>
                    @Html.DisplayFor(model => model.Title)
                </li>
                <li>
                    @Html.DisplayFor(model => model.Category.Name)
                </li>
                <li>
                    @Html.DisplayFor(model => model.Price)
                </li>
                <li>
                    @Html.DisplayFor(model => model.AddTime)
                </li>
            </ul>
            @Html.Raw(Model.Description)
        </div>
    </fieldset>
    <p>
        @Html.ActionLink("返回列表", "Index") |
    </p>

    为ProductController的添加处理和编辑处理方法的HttpPost标识头修改为:

    [HttpPost,ValidateInput(false)]

    重新编译项目,运行,先看一下测试效果:

    现在在我们来简单看一下关键代码:

    Edit.cshtml

    <script src="../../kindeditor/kindeditor-all-min.js" type="text/javascript"></script>
    <script type="text/javascript">
        KindEditor.ready(function (K) {
            var editor1 = K.create('#Description', {
                cssPath: '../../kindeditor/plugins/code/prettify.css',
                uploadJson: '/tools/upload_json.ashx',
                fileManagerJson: '/tools/file_manager_json.ashx',
                allowFileManager: true
            });
        });
    </script>

    引入kindeditor的js和绑定编辑器,Create也是一样;
    ProductController.cs,Cteate和Edit处理方法头部加上了下方标识:

    ValidateInput(false)

    主要是为了取消页面的ValidateRequest验证,以免当我们提交由html字符时当作敏感字符处理出现错误,在webform里可以在web.config里pages节点配置,经测试mvc3下此做法不生效

    至此,在MVC3下已完成验证码和编辑器功能

  • 相关阅读:
    android app压力测试(二)——monkey测试结果分析
    android app压力测试(一)---monkey介绍及基本使用
    如何根据apk文件获取包名
    adb常用命令
    APP的安装卸载测试
    unittest生成html测试报告
    python,向已经存在数据的excel中添加数据
    HTTP协议简介
    jmeter如何确定ramp-up时间
    jmeter分布式压测
  • 原文地址:https://www.cnblogs.com/hswh/p/3171118.html
Copyright © 2011-2022 走看看