ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面
1,学习了解Model的具体作用
2,新建Controller从Model中读取数据传递到View中
3,了解Entity Framework Code First
4,清楚View页面中@model 声明的强类型转换
5,查看View .cshtml的新的HTML书写方法
一,Add a new Model ,了解Model的作用
Model:存放Model Class,对应数据库中的table,存取Table中的数据
Model Class中的每一个实例对应数据库Table中的一行,实例中的每一个属性对应Table中的每一列值(Model Class和DB Table的映射关系)
Entity FrameWork关系数据模型定义,
可以看右边这张图,回头有时间在看连接的介绍
https://msdn.microsoft.com/en-us/data/aa937709
Right-click Model floder and Add a new Model Class:Movie.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
namespace MVCMovie.Models
{
//Moive 类就相当于数据库中的一张名为Movie的Table
//Movie 类实例化的对象相当于Table中的一行,实例的各个属性(ID,Title...)相当于Table中的列
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
//MovieDBContext class ,继承自Entity Framework中的DbContext,代表这Movie数据上下文
//MovieDBContext class ,读取、存储、更新Movie Class 实例
public class MovieDBContext : System.Data.Entity.DbContext
{
public DbSet<Movie> Movies { get; set; }
}
}
配置WebConfig文件:
1
2
3
4
5
<connectionStrings>
<!--ModleDBContext连接字符串,使Movie数据存放于数据库中-->
<add name="MovieDBContext" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Movies.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MVCMovie-20140304145549;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-MVCMovie-20140304145549.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>
二,重建方案后,Add a new Control to Access Model’s Data ,了解数据Controller怎么从Model读取数据
Right-click Control floder and add a new control
新添加的MovieController中就自动有了万增的增删查改的功能,CRUD (create, read, update, and delete),以及对应的CRUD View。页面中就可以creat,list,edit and delete Moive 实体(entries). ctrl+F5运行: https://localhost:9898/movies
2.1查看系统自动生成的 MoviesController 中的代码:
1
2
3
4
5
6
7
8
9
10
11
//实例化一个MovieDBContext db,然后用这个实例化的对象去增查改删(GRUD)
private MovieDBContext db = new MovieDBContext();
//
// GET: /Movies/
public ActionResult Index()
{
//返回 Movie Database 中的所有的 Movie实例
return View(db.Movies.ToList());
}
2.2 强类型模型,和@model关键字
我们之前有讲过ViewBage是一个动态对象,可以把数据或对象从Controller传递到View中。ASP.NET MVC同样提供了强类型(strongly typed data)到view template.这种强类型,VS可以在编译的时候更好的检查你的代码以及提供智能感知(richer IntelliSence).这种脚手架机制(scaffolding mechanism),在Controller的Methods中和View Template的Views中都有体现。
现在我们先来看看Controller中自动生成的code
复制代码
// GET: /Movies/Details/
//以下方法,从实例化后的Movie对象中读取Movie数据
public ActionResult Details(int id = 0)
{
//如果id对应的Movie找到,则Return到Detail.cshtml中
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
复制代码
然后转到View 中的Details.cshtml看一下,第一行:
1
@model MVCMovie.Models.Movie
Detail.cshtml最上面的这一行的声明(Statement),指定了object是View可以接受的类型
之前从Model生成MovieController的时候同时 也生成了Controller中Method对应的View,@model的声明也是系统自动加上去的
@model指令,对Model对象强制类型转换,把Controller从Model中获取的数据传递到View Template中
例如,在Detail.cshtml中,code把movie 字段中的数据通过 stronged typed的 MVCMovie.Models.Movie 把数据从Controller传递到Detail.cshtml中
Index.cshtml中,仔细查看代码,看一下数据是怎样在View中显示出来的
1
@model IEnumerable<MVCMovie.Models.Movie><br>......<br> @foreach (var item in Model)<br> {<br> <tr><br> <td><br> @Html.DisplayFor(modelItem => item.Title)<br> </td><br> <td><br> @Html.DisplayFor(modelItem => item.ReleaseDate)<br> </td><br> <td><br> @Html.DisplayFor(modelItem => item.Genre)<br> </td><br> <td><br> @Html.DisplayFor(modelItem => item.Price)<br> </td><br> <td><br> @Html.ActionLink("Edit", "Edit", new { id = item.ID }) |<br> @Html.ActionLink("Details", "Details", new { id = item.ID }) |<br> @Html.ActionLink("Delete", "Delete", new { id = item.ID })<br> </td><br> </tr><br> }
这一行statement同样是vs automatically create的