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下已完成验证码和编辑器功能

 

 

posted @ 2013-07-04 10:39  韩若怅  阅读(519)  评论(1编辑  收藏  举报