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 > }
效果如下: