VS2010 mvc3.0学习入门-2

来源:互联网 发布:php解密工具 编辑:程序博客网 时间:2024/05/16 14:45

5.1 从控制器访问模型中的数据

鼠标右击Controllers文件夹,点击“添加”菜单下的“控制器”菜单项,将会弹出一个“添加控制器”对话框,在该对话框中将控制其命名为MoviesController,ontrollers文件夹下增加了一个名为MoviesController.cs的文件.
  这里需要注意的是,为了引用我们前面创建的MovieDBContext类,你需要在文件头部追加如下所示的两个using语句。
using MvcMovie.Models;
using System.Linq;
 修改MoviesController类中的代码为代码清单5-1中所示代码。
   代码清单5-1 MoviesController类中的完整代码
sing MvcMovie.Models;
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());

        }
    }
}

这段代码实施了一个LINQ查询来获取1984年夏天之后发行的所有电影。我们还需要一个视图模板来显示这个电影清单,所以在Index方法内点击鼠标右键,然后点击“添加视图”来添加一个视图。
但是这一次我们想让Visual Web Developer为我们自动创建一个具有一些默认处理的强类型的视图,所以我们勾选“创建强类型视图”复选框,在模型类下拉框中选择“Movie(MvcMovie.Models)”(如果模型类中不存在这个类,请先点击调试菜单下的“生成MvcMovie”生成该类),在支架模板下拉框中选择“List”,最后勾选“引用脚本”复选框,如图5-2所示。

.使用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语法――方法语法或者查询语法。这两种方法在性能上没有任何区别――唯一的区别是风格。



5.2 强类型模型与@model关键字
在本教程的前文中,我们介绍了一个控制器可以使用ViewBag对象来将数据或对象传递到视图模板中。ViewBag是一个动态对象,它提供了一种便利的,后期绑定的方法来将信息从控制器传递到视图中。
请注意如下这一行代码表示将一个movies列表从控制器传递到了视图中。
return View(movies.ToList());
通过在视图模板文件的头部使用@model语句,视图模板可以识别传入的参数中的对象类型是否该视图模板所需要的对象类型
因为这里的“模型”是强类型的(IEnumerable<Movie>),所以在循环遍历时“模型”中的每一个项目(“item”)也是一个强类型的Movie对象,
EF code-first如果发现使用我们提供的连接字符串而连接到的数据库中没有“Movies”数据库,它将自动为我们创建一个。你可以在类似“C:\Program Files\Microsoft SQL \MSSQL10.SQLEXPRESS\MSSQL\DATA”这样的SQL Server的安装目录下去查看是否该数据库已被创建。
第六节 增加一个追加数据的方法和一个追加数据的视图
6.1 显示追加信息时所用表单
    首先,我们需要在我们的MoviesController类中追加一个Create方法,该方法返回一个视图,该视图中包含了用户输入信息时所要用到的表单。
public ActionResult Create() 
{
    return View();
}
在Create方法中点击鼠标右键,并点击上下文菜单中的“添加视图”。
    在“添加视图”对话框中选择“创建强类型视图”,将模型类指定为“Movie”,在支架模板中选择Create,如图6-1所示。

   <div class="editor-label">
            @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>
6.2 处理HTTP-POST
    到此为止,我们已经实现了显示追加数据所用表单的所需代码。我们的下一步是编写代码来进行表单提交到服务器后的处理。我们将要获取用户在数据库中输入的信息并且将它们作为一个新的Movie保存到数据库中。
代码清单6-4 MoviesController类中的两个Create方法的全部代码
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);
}
调用我们的MoviesDBContext对象实例的SaveChanges方法将把这个Movie对象保存在数据库中。保存数据完毕后,代码把画面重定向到MoviesController类的Index方法中
                                第七节 在Movie(电影)模型与数据表中添加一个字段
让Entity Framework自动删除当前数据库,并在新的模型类的基础上重新创建该数据库。这种方法在使用一个测试数据库时对于开发来说是十分方便的,因为它允许你快速地同步修改模型与数据库。但缺点是你将丢失现存库中的数据(所以请不要将这个方法使用在实际使用中的数据库上)。
修改数据库中的数据表的结构来使之与模型相匹配。这个方法的好处是可以让你保留表中的数据。你可以手工实现这一操作,或创建一个数据表修改脚本来实现这一操作。
    在本教程中,我们使用第一种方法,在任何模型发生了改变的情况下让EF code-first自动重建数据库。

7.4 修正票价字段的精度
  为了改变我们的票价(Price)字段在数据表中的精度,打开Models文件夹下的Movie.cs文件。追加一句引用System.Data.Entity.ModelConfiguration的语句,代码如下所示。
using System.Data.Entity.ModelConfiguration;
在我们现在的MovieDBContext类中重载OnModelCreating方法,代码如下所示。
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);
    }
}
8.2 在Movie模型中追加验证规则
    public class Movie
    {
        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; }
    }
ModelState.IsValid属性用来判断是否提交的电影数据中包含有任何没有通过数据验证的无效数据
第九节 实现编辑、删除与明细信息视图
首先打开Movie控制器,追加一个返回明细数据视图的Details方法,代码如下所示。
// 
// GET: /Movies/Details 
public ActionResult Details(int id)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
        return RedirectToAction("Index");
    return View("Details", movie);
}
在Details方法中点击鼠标右键,选择“添加视图”,依然勾选“创建强类型视图”,模型类选择Movie,在支架模板中选择“Details”(明细数据)
通过使用Find方法来让一条数据的寻找变得非常容易
9.2 实现数据的修改视图
首先打开Movie控制器,追加一个返回数据修改视图的Edit方法与一个对该视图中的表单提交进行处理的Edit方法,代码如下所示。
// 
// 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所示
ASP.NET <wbr>MVC3 <wbr>快速入门-第九节 <wbr>实现编辑、删除与明细信息视图

FormCollection是一个专门用于处理搜集从外部网页跳转到本Controller之后,获取Form表单的Name和Value的“键值对”。 在Delete中完全可以通过FormCollection获取表示数据主键的id标识,然后删除。
// 
//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");
}
原创粉丝点击