接上文,我们来完善验证功能。在System.ComponentModel.DataAnnotations命名空间中,已经有了一些基本的属性类来实现验证功能,只要把这些属性加到Model的字段上就可以了。具体的属性类可以查MSDN, 下面给出一个例子:
public
class
Movie
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public
int
ID {
get
;
set
; }
[StringLength(
10
,MinimumLength
=
2
,ErrorMessage
=
"
必须是2~10个字符长
"
),Required,Display(Name
=
"
名称
"
)]
public
string
Title {
get
;
set
; }
[Display(Name
=
"
发布日期
"
)]
public
DateTime ReleaseDate {
get
;
set
; }
public
string
Genre {
get
;
set
; }
[Range(
1
,
100
,ErrorMessage
=
"
必须是1~100
"
)]
public
decimal
Price {
get
;
set
; }
public
string
Rating {
get
;
set
; }
}
再运行下程序,就可以看到效果:
当然,默认的验证往往并不足够,可以尝试下将日期改为201-01-1,点击Create,就会引发异常。我们可以增加自定义的验证属性来满足验证要求。下面我们来实现一个DateAttribute属性来实现日期格式和日期范围的检查。新建一个动态链接库Biz.Web,添加System.ComponentModel.DataAnnotations引用,新建一个类如下:
using
System;
using
System.Collections.Generic;
using
System.ComponentModel.DataAnnotations;
using
System.Data.SqlClient;
namespace
Biz.Web
{
[AttributeUsage(AttributeTargets.Property
|
AttributeTargets.Field, AllowMultiple
=
false
)]
public
class
DateAttribute:ValidationAttribute
{
public
DateAttribute()
{
//
set default max and min time according to sqlserver datetime type
MinDate
=
new
DateTime(
1753
,
1
,
1
).ToString();
MaxDate
=
new
DateTime(
9999
,
12
,
31
).ToString();
}
public
string
MinDate
{
get
;
set
;
}
public
string
MaxDate
{
get
;
set
;
}
private
DateTime minDate, maxDate;
//
indicate if the format of the input is really a datetime
private
bool
isFormatError
=
true
;
public
override
bool
IsValid(
object
value)
{
//
ignore it if no value
if
(value
==
null
||
string
.IsNullOrEmpty(value.ToString()))
return
true
;
//
begin check
string
s
=
value.ToString();
minDate
=
DateTime.Parse(MinDate);
maxDate
=
DateTime.Parse(MaxDate);
bool
result
=
true
;
try
{
DateTime date
=
DateTime.Parse(s);
isFormatError
=
false
;
if
(date
>
maxDate
||
date
<
minDate)
result
=
false
;
}
catch
(Exception)
{
result
=
false
;
}
return
result;
}
public
override
string
FormatErrorMessage(
string
name)
{
if
(isFormatError)
return
"
请输入合法的日期
"
;
return
base
.FormatErrorMessage(name);
}
}
}
主要实现IsValid方法,如有需要也可以实现FormatErrorMessage方法。要注意属性的参数只能是有限的几种类型,参考这里。写好以后,把HelloWorld项目添加Biz.Web引用,然后就可以使用了,例如:
[Display(Name
=
"
发布日期
"
),Date(MaxDate
=
"
2012-01-01
"
,ErrorMessage
=
"
2012地球灭亡啦
"
)]
public
DateTime ReleaseDate {
get
;
set
; }
看下效果:
当然,这种方式有许多限制,主要是属性参数的限制,只能是基本类型,而且只能是常量。更复杂的验证规则的添加请看这里:
Implement Remote Validation in ASP.NET MVC.
下面为lndex页面加上一些筛选功能。通过给Index传递参数来实现筛选,在页面添加一个selectbox来筛选Genre字段,把MovieController的方法改成:
public
ViewResult Index(
string
movieGenre)
{
var genre
=
(from s
in
db.Movies
orderby s.Genre
select s.Genre).Distinct();
ViewBag.MovieGenre
=
new
SelectList(genre);
//
给前台准备下拉列表的数据。
if
(
!
string
.IsNullOrEmpty(movieGenre))
{
//
筛选
var movies
=
from s
in
db.Movies
where
s.Genre
==
movieGenre select s;
return
View(movies);
}
return
View(db.Movies.ToList());
}
在View页面,添加一个Form,里面放上一个选择框和一个按钮,代码如下:
@using (Html.BeginForm(
"
Index
"
,
"
Movie
"
, FormMethod.Get))
{
<
p
>
Genre: @Html.DropDownList(
"
MovieGenre
"
,
"
全部
"
)
<
input type
=
"
submit
"
value
=
"
筛选
"
/></
p
>
}
效果如下:
本文详细介绍了如何在ASP.NET MVC中利用System.ComponentModel.DataAnnotations命名空间进行基本的验证功能实现,并通过自定义DateAttribute属性扩展了日期验证功能。通过实例展示了如何使用自定义验证属性来满足特定的验证需求,包括日期格式和日期范围的检查。同时,文章还介绍了如何在Index页面添加筛选功能,通过给Index传递参数来实现根据Genre字段进行筛选,从而提供了更加灵活的用户交互体验。


150

被折叠的 条评论
为什么被折叠?



