5.1 从控制器访问模型中的数据
using MvcMovie.Models;
using System.Linq;
代码清单5-1 MoviesController类中的完整代码
using System.Linq;
using System;
using System.Web.Mvc;
namespace MvcMovie.Controllers
{
public class MoviesController : Controller
{
MovieDBContext db = new MovieDBContext();
public ActionResult Index()
{
var movies=from m in db.Movies
where m.ReleaseDate>new DateTime(1984,6,1)
select m;
return View(movies.ToList());
}
}
}
.使用Entity Framework选择数据库记录
让我们通过创建一个显示movie记录列表的页面来开始构建我们的Movie数据库应用程序。代码1中的Home控制器发布了一个名为Index()的动作。通过使用Entity Framework,Index()动作返回了来自Movie数据库表的所有movie记录。
代码清单1 - ControllersHomeController.cs
using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;
namespace MovieEntityApp.Controllers {
[HandleError]
public class HomeController : Controller {
MoviesDBEntities _db;
public HomeController() {
_db = new MoviesDBEntities();
}
public ActionResult Index() {
ViewData.Model = _db.MovieSet.ToList();
return View();
}
}
}
注意到代码1中的控制器含有一个构造函数。这个构造函数初始化了一个类级的字段,叫做_db。_db字段代表着由Microsoft Entity Framework生成的数据库实体。_db字段是一个MoviesDBEntities类的实例,该实例由“实体设计器”生成。
NOTE:为了在Home控制器中使用MoviesDBEntites类,你必须引入MovieEntityApp.Models命名空间。
在Index()动作中使用了_db字段,用于获取Movies数据库表中的记录。表达式_db.MovieSet代表了所有来自Movies数据库表的记录。ToList()方法用于将movies记录集转换为一个Movie对象的泛型集合(List<Movie>)。
movie记录在LINQ to Entities的帮助下获得。代码1中的Index()动作使用了LINQ方法语法(method syntax)来获取数据库的记录集。如果你愿意,你也可以使用LINQ查询语法(query syntax)。下面两行语句完成了同样的事情:
ViewData.Model = _db.MovieSet.ToList();
ViewData.Model = (from m in _db.MovieSet select m).ToList();
使用你最有感觉的任意一种LINQ语法――方法语法或者查询语法。这两种方法在性能上没有任何区别――唯一的区别是风格。
return View(movies.ToList());
首先,我们需要在我们的MoviesController类中追加一个Create方法,该方法返回一个视图,该视图中包含了用户输入信息时所要用到的表单。
public ActionResult Create()
{
return View();
}
在“添加视图”对话框中选择“创建强类型视图”,将模型类指定为“Movie”,在支架模板中选择Create,如图6-1所示。
@Html.LabelFor(model => model.Title)//Html.LabelFor帮助器用于显示字段名(”Title”,”ReleaseDate”,”Genre”或者”Price”)
</div>
<div class="editor-field">//Html.EditorFor帮助器用于显示一个提供给用户输入信息的HTML的<input>元素
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)//帮助器用于显示一个针对属性的校验信息
</div>
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Movie newMovie)
{
if (ModelState.IsValid)
{
db.Movies.Add(newMovie);
db.SaveChanges();
return RedirectToAction("Index");
}
else
return View(newMovie);
}
修改数据库中的数据表的结构来使之与模型相匹配。这个方法的好处是可以让你保留表中的数据。你可以手工实现这一操作,或创建一个数据表修改脚本来实现这一操作。
在本教程中,我们使用第一种方法,在任何模型发生了改变的情况下让EF code-first自动重建数据库。
public class MovieDBContext : DbContext
{
public DbSet<Movie> Movies { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Movie>().Property(p => p.Price).HasPrecision(18, 2);
}
}
{
public int ID { get; set; }
[Required(ErrorMessage = "必须输入标题")]
public string Title { get; set; }
[Required(ErrorMessage = "必须输入发行日期")]
public DateTime ReleaseDate { get; set; }
[Required(ErrorMessage = "必须指定种类")]
public string Genre { get; set; }
[Required(ErrorMessage = "必须输入票价")]
[Range(1, 100, ErrorMessage = "票价必须在1元到100元之间")]
public decimal Price { get; set; }
[StringLength(5,ErrorMessage = "最多允许输入五个字符")]
public string Rating { get; set; }
}
// GET: /Movies/Details
public ActionResult Details(int id)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
return RedirectToAction("Index");
return View("Details", movie);
}
// GET: /Movies/Edit
public ActionResult Edit(int id)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
return RedirectToAction("Index");
return View(movie);
}
//
// POST: /Movies/Edit
[HttpPost]
public ActionResult Edit(Movie model)
{
try
{
var movie = db.Movies.Find(model.ID);
UpdateModel(movie);
db.SaveChanges();
return RedirectToAction("Details", new { id = model.ID });
}
catch (Exception)
{
ModelState.AddModelError("", "修改失败,请查看详细错误信息。");
}
return View(model);
} 接下来让我们来追加该数据修改视图、在Edit方法中点击鼠标右键,选择“添加视图”,依然勾选“创建强类型视图”,模型类选择Movie,在支架模板中选择“Edit”(修改数据),如图9-4所示
//GET: /Movies/Delete
public ActionResult Delete(int id)
{
Movie movie = db.Movies.Find(id);
if (movie == null)
return RedirectToAction("Index");
return View(movie);
}
//
// POST: /Movies/Delete
[HttpPost]
public RedirectToRouteResult Delete(int id,FormCollection collection)
{
var movie = db.Movies.Find(id);
db.Movies.Remove(movie);
db.SaveChanges();
return RedirectToAction("Index");
}