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;
}
}
运行一下效果还是和之前的一样, 但是这样就不担心在自动生成的时候, 冲掉特性标签了
浙公网安备 33010602011771号