您的位置:首页 > 其它

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

2013-07-04 10:39 881 查看
本章学习内容

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下已完成验证码和编辑器功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐