接下来我们修改一下模型Movie.cs,增加一些显示以及验证的东西。
public int ID { get; set; }
[Display(Name="电影名称")]
public string Title { get; set; }
[Display(Name="上映日期")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Display(Name="电影类别")]
public string Genre { get; set; }
[Display(Name="电影票价")]
public decimal Price { get; set; }
添加了一些显示字段名称的东西,还有添加了上映日期这个字段的类型是日期型。
如果我们输入的不符合的数据类型,也会有自动验证的提醒。
接下来我们在做一个搜索的功能,通过电影标题进行模糊查询。
首先修改Index视图,增加一个文本输入框和一个查询按钮。代码如下所示。
<p>
@Html.ActionLink("Create New", "Create")
@using(Html.BeginForm())
{
<p>输入名称:@Html.TextBox("SearchString") <input type="submit" value="查询" /> </p>
}
</p>
值得注意的是此处将TextBox的名字设为SearchString,在Controller中会使用到这个值。来看看重写的Index方法。
// GET: /Movie/
public ActionResult Index(string SearchString)
{
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
return View(movies);
}
这里的参数辨识SearchString,我的理解是,当程序运行的时候,SearchString会被视图那边的那个TextBox的值所替代,然后进行判断,这里用到了Linq和Lambda的知识,与我们之前学的SQLServer不太一样,需要重新学习。但是意思应该是很容易理解的。就是查询是否有电影名称包含SearchString的电影。有则返回。没有则返回所以电影。
注意虽然这里有提交按钮,但是我们并没有给这个方法定义为HttpPost,这是因为我们只是做了一个查询而已,并没有修改到任何数据。
我们观察到,虽然我们点击了查询按钮,但是地址栏还是显示http://localhost:12149/Movie/Index,如果我们把这个URL发给别人,别人还是没法得到查询结果。怎么办呢,只需要改变一下Index视图页的@Html.BeginForm,改成这样:@using(Html.BeginForm("Index","Movie",FormMethod.Get)),这样以后,就能得到带有参数的URL了。如:
http://localhost:12149/Movie?SearchString=FRozen。
接下去,我们使用电影类别来进行查询。首先修改Index的视图页,添加一个dropdownlist。如下:
电影类别:@Html.DropDownList("movieGenre","All")
然后修改Controller中 代码。这边将有两个要做的,第一是将数据库的数据显示在视图页面上,这里我们可以使用viewBag进行显示,另一个是读取视图页上的数据,然后根据这个数据来返回查询结果。代码如下:
public ActionResult Index(string movieGenre,string SearchString)
{
var Genrelst = new List<string>();
var GenreQry = from d in db.Movies
orderby d.Genre
select d.Genre;
Genrelst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(Genrelst);
var movies = from m in db.Movies
select m;
if (!String.IsNullOrEmpty(SearchString))
{
movies = movies.Where(s => s.Title.Contains(SearchString));
}
if(!string.IsNullOrEmpty(movieGenre))
{
movies = movies.Where(x => x.Genre == movieGenre);
}
return View(movies);
}
这样我们就可以根据电源类别和电源标题的模糊查询来进行电源的查询了。
最后,我们来学习下数据库迁移以及验证方面的内容。
首先说说为什么要进行数据库迁移,这是因为当我们修改了model的内容以后,要持久化化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会产生一个问题,当我们的旧数据库中包含一些测试数据时,当持久化更新后,原数据将全部丢失,故我们可以引入EF的数据迁移功能来完成。
比如我们先在model中再添加一个叫做Rating的字段,修改后的model变成如下:
public int ID { get; set; }
[Display(Name="电影名称")]
public string Title { get; set; }
[Display(Name="上映日期")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Display(Name="电影类别")]
public string Genre { get; set; }
[Display(Name="电影票价")]
public decimal Price { get; set; }
[Display(Name = "等级")]
public string Rating { get; set; }
但是我们运行以后会出现错误,这是因为只是model中新增加了这个字段,在我们的实际数据库中并没有增加这个字段,这时候,我们就得进行迁移。打开工具--Nuget程序管理包(必须安装才有),然后键入命令:
Enable-Migrations -ContextTypeNameMvcMovie.Models.MovieDBContext
这条命令会创建一个Migration文件夹,里面有一个Configuration.cs,该文件中有个seed方法,每次update数据库的时候,都会执行这个方法,你可以在这个方法中写入一些东西,也可以什么都不写。
然后输入下面指令来记录首次迁移:add-migration Initial,这条指令会在Migration文件夹生成一个201409090422413_Initial.cs的文件,用以记录首次迁移的改变。然后我们键入命令:updade-database就可以使数据库得到更新了。
如果我们需要在进行修改,只需要按上述步骤,先用add-migration XXX记录一下这次迁移,然后再update-database即可完成迁移,而且不会导致数据库遗失。