在这一部分中,您将创建一个新的moviescontroller类写代码,检索数据并将其显示在电影中使用视图模板浏览器。
在进行下一步之前建立应用程序。如果你不建立应用程序,你会得到一个错误添加一个控制器。
在“解决方案资源管理器”中,右键单击“控制器”文件夹,然后单击“添加”,然后单击“控制器”按钮。
在“添加材料”对话框中,单击“MVC 5控制器和视图,使用实体框架,然后单击“添加”。
- 控制器的名称选择MoviesController。
- 选择电影 Movie
(MvcMovie.Models)作为模型类。 - 选择MovieDBContext (MvcMovie.Models)作为数据上下文类。
下面的图像显示已完成的对话框。
单击“添加”。(如果您收到一个错误,您可能没有在开始添加控制器之前创建应用程序):
Visual Studio创建下面的文件和文件夹:
- MoviesController.cs在Controllers文件夹中。
- Views\Movies文件夹。
- Create.cshtml,Delete.cshtml,Details.cshtml,Edit.cshtml,和Index.cshtml在新建的Views\Movies文件夹中。
Visual Studio自动生成CRUD(创建,读取,更新,删除,你的行动)的方法与观点(CRUD操作方法和视图自动创建称为支架)。您现在有一个完全功能的Web应用程序,可以让您创建、列表、编辑和删除电影条目。
启动应用程序并单击MVC Movie的链接(或浏览Movies
controller通过添加/Movies在浏览器的地址栏中的URL)。因为应用程序依赖于默认路由(在App_Start\RouteConfig.cs文件中定义),浏览器请求的http://localhost:xxxxx/Movies路由到Movies
controller默认的Index动作方法。换句话说,浏览器实际上请求的是http://localhost:xxxxx/Movies/Index。运行结果是一个空的列表的电影,因为你还没有添加任何内容。
创建一个电影
选择创建新链接。请输入有关电影的详细信息,然后单击“创建”按钮。
注意:你可能无法在价格栏输入小数点或逗号。为了支持非英语语言环境,用逗号,jQuery验证(“,”)一个小数点,而非美国英语的日期格式,你必须包括globalize.js和特定文化/ globalize.cultures.js文件(从https://github.com/jquery/globalize)和JavaScript的使用globalize.parsefloat。我将展示如何在下一个教程中做到这点。现在,只要输入整个数字像10。
创建更多的电影条目。尝试编辑、详细信息和删除链接,这些链接都是功能性的。
检查生成的代码
打开Controllers\MoviesController.cs文件并检查生成的Index方法。用Index方法的movie
controller的一部分如下所示。
public class MoviesController : Controller { private MovieDBContext db = new MovieDBContext(); // GET: /Movies/ public ActionResult Index() { return View(db.Movies.ToList()); }
对Movies
controller的一个请求返回Movies表中的所有条目,然后将结果传递给Index视图。下面从MoviesController类实例化一个movie数据库上下文,如前所述。可以使用movie 数据库上下文来查询、编辑和删除电影。
private MovieDBContext db = new MovieDBContext();
强类型Models和@model关键字
在本教程的时候,你看到一个控制器可以通过数据或对象使用ViewBag对象视图模板。ViewBag是一个动态对象,提供了一个方便的后期绑定的方式把信息传递给视图。
MVC也提供了通过强类型对象的一个视图模板的能力。这个强类型的方法可以更好的编译时检查你的代码和更丰富的智能感知在Visual Studio编辑器。Visual Studio中的脚手架机制使用这种方法(即通过强类型模型)与MoviesController类和视图时,它创造的方法和视图模板。
在Controllers\MoviesController.cs文件检查生成的Details节的方法。Details方法如下所示。
public ActionResult Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie); }
id参数一般是通过路由数据,例如http://localhost:1234/movies/details/1将controller设置为movie
controller,把action设置为details和把id设置为1。
您也可以通过一个查询字符串传递的id如下:
http://localhost:1234/movies/details?id=1
如果找到一个电影,则将该电影模型的一个实例传递给Details视图:
return View(movie);
检查该视图的Views\Movies\Details.cshtml文件:
@model MvcMovie.Models.Movie @{ ViewBag.Title = "Details"; } <h2>Details</h2> <div> <h4>Movie</h4> <hr /> <dl class="dl-horizontal"> <dt> @Html.DisplayNameFor(model => model.Title) </dt> @*Markup omitted for clarity.*@ </dl> </div> <p> @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) | @Html.ActionLink("Back to List", "Index") </p>
通过在视图模板文件的顶部包含一个 @model
,您可以指定视图所期望的对象的类型。当你创建了movie
controller,Visual Studio自动包括以下声明@model在Details.cshtml文件顶部:
@model MvcMovie.Models.Movie
这个@model允许您访问通过使用强类型的模型对象传递给视图的控制器的电影。例如,在Details.cshtml模板,代码经过每一个电影领域的DisplayNameFor
和 DisplayFor HTML
Helpers 的强类型对象模型。Create和Edit方法和视图模板也通过了一个电影模型对象。
检查的Index.cshtml视图模板和在MoviesController.cs文件的Index方法。注意在Index action方法中调用View helper方法时,代码将创建一个List
对象。该代码将此电影列表从Index action方法传递给视图:
public ActionResult Index() { return View(db.Movies.ToList()); }
当你创建了movie控制器,Visual Studio自动在Index.cshtml文件顶部包括以下@model:
@model IEnumerable<MvcMovie.Models.Movie>
这个@model允许您访问通过使用强类型的模型对象将控制器传递给视图的电影列表。例如,在Index.cshtml模板、代码的循环通过电影做一个foreach语句在强类型对象Model:
@foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <th> @Html.DisplayFor(modelItem => item.Rating) </th> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) </td> </tr> }
由于模型对象的强类型(如一个IEnumerable<Movie>对象),在回路的每个项目的对象是类型电影。其他好处是,这意味着你编译时的代码,在代码编辑器中完全的智能感知支持检查:
与SQL Server LocalDB一起工作
实体框架代码首先检测到提供指向的数据库连接字符串指向一个不存在的Movies数据库,所以代码首先自动创建数据库。你可以证明那是看在App_Data文件夹中创建。如果你没有看到Movies.mdf文件,单击“显示所有文件”按钮,在“解决方案资源管理器”工具栏上,单击刷新按钮,然后展开App_Data文件夹。
双击Movies.mdf打开“服务器资源管理器”,然后展开Tables文件夹看Movies表。在默认情况下,在标识旁边的键图标上,将使一个名为ID的属性为主键。
右键单击Movies并选择“显示表数据”来查看所创建的数据。
右键单击Movies表,然后选择“打开表定义”,查看“实体框架代码”为您创建的表结构。
注意看Movies表映射到你前面创建的Movie类的模式如何。实体框架代码首先基于您的Movie类自动为您创建此架构。
当你完成后,用鼠标右键单击MovieDBContext 然后选择Close
Connection。(如果你不关闭连接,你可能会得到一个错误,下次你运行该项目)。
您现在有一个数据库和页面来显示、编辑、更新和删除数据。在下一个教程中,我们将检查脚手架的其他代码和添加SearchIndex方法和SearchIndex视图使我们可以搜索该数据库中的电影。有关使用实体框架与MVC的更多信息,请参见创建一个ASP.NET的MVC应用实体框架的数据模型。