Asp.Net MVC4入门指南(5):从控制器访问数据模型

在本节中,您将创建一个新的MoviesController类,并在这个Controller类里编写代码来取得电影数据,并使用视图模板将数据展示在浏览器里。

在开始下一步前,先Build一下应用程序(生成应用程序)(确保应用程序编译没有问题)

 

用鼠标右键单击Controller文件夹,并创建一个新的 MoviesController控制器。当Build成功后,会出现下面的选项。设定以下选项:

· 控制器名称: MoviesController.(这是默认值)。

· 模板: MVC Controller with read/write actions and views, using Entity Framework.

· 模型类:Movie (MvcMovie.Models).

· 数据上下文类: MovieDBContext (MvcMovie.Models).

· 意见:Razor (CSHTML).(默认值)。

clip_image001

 

单击添加。Visual Studio Express 会创建以下文件和文件夹:

· 项目控制器文件夹中的MoviesController.cs文件。

· 项目视图文件夹下的 Movie文件夹。

· 在新的Views\Movies文件夹中创建Create.cshtml、 Delete.cshtml、 Details.cshtml、 Edit.cshtml和Index.cshtml 文件。

ASP.NET MVC 4 自动创建 CRUD (创建、 读取、 更新和删除) 操作方法,和相关的视图文件(CRUD 自动创建的操作方法和视图文件被称为基础结构文件)。现在您有了可以创建,列表、 编辑和删电影Entity 所有的Web功能了。

运行应用程序,通过将/Movies追加到浏览器地址栏 URL的后面,从而浏览Movies控制器。因为应用程序依赖于默认路由 ( Global.asax文件中的定义),浏览器请求http://localhost:xxxxx/Movies将被路由到Movies控制器默认的Index 操作方法。换句话说,浏览器请求http://localhost:xxxxx/Movies等同于浏览器请求http://localhost:xxxxx/Movies/Index。因为您还没有添加任何内容,所以结果是一个空的电影列表。

clip_image002

 

 

创建电影

点击Create New链接。输入有关电影的一些详细信息,然后单击Create按钮。

clip_image003

单击Create按钮将使得窗体提交至服务器,同时电影信息也会保存到数据库里,然后您会被重定向到URL/Movies,您可以在列表中看到您刚刚创建的新电影。

clip_image004

创建一些更多的电影数据。同时也可以尝试点击编辑详细信息删除功能的链接。

看一下生成的代码

打开Controllers\MoviesController.cs文件,并找到生成的Index方法。一本部分电影控制器和Index方法如下所示。

复制代码
public class MoviesController : Controller
{private MovieDBContext db = new MovieDBContext();//// GET: /Movies/public ActionResult Index(){return View(db.Movies.ToList());}
复制代码

 

下面是MoviesController类中实例化电影数据库上下文实例,如前面所述。电影数据库上下文实例可用于查询、 编辑和删除的电影。

private MovieDBContext db = new MovieDBContext();

 

Movies控制器请求,从而返回Movies电影数据库表中的所有记录,然后将结果传递给Index视图。

强类型模型和 @model 关键字

在本系列之前的教程中,您看到了使用ViewBag对象,从控制器传递数据或对象给视图模板。ViewBag是一个动态的对象,提供了方便的后期绑定方法将信息传递给视图。

ASP.NET MVC 还提供了传递强类型数据或对象到视图模板的能力。这种强类型使得更好的在编译时检查您的代码并在Visual Studio 编辑器中提供更加丰富的智能感知。当创建操作方法和视图时, Visual Studio 中的基础结构机制使用了MoviesController类和视图模板。

Controllers\MoviesController.cs文件中看一下生成的Details方法。电影控制器里的Details方法如下所示。

复制代码
public ActionResult Details(int id = 0)
{Movie movie = db.Movies.Find(id);if (movie == null){return HttpNotFound();}return View(movie);
}
复制代码

 

如果查找到了一个MovieMovie 模型的实例会传递给Detail视图。看一下Views\Movies\Details.cshtml文件里的内容。

通过引入视图模板文件顶部的@model语句,您可以指定该视图期望的对象类型。当您创建电影控制器时,Visual Studio 会将@model声明自动包含到Details.cshtml文件的顶部:

@model MvcMovie.Models.Movie

@model声明使得控制器可以将强类型的Model对象传递给View视图, 从而您可以在视图里访问传递过来的强类型电影Model。例如,在Details.cshtml模板中,DisplayNameFor 和DisplayFor HTML Helper通过强类型的Model对象传递了电影的每个字段。创建和编辑方法还有视图模板都在传递电影的强类型模型对象。

看一下Index.cshtml视图模版和MoviesController.cs中的Index 方法。请注意这些代码是如何在Index操作方法中,创建List对象,并调用View方法的。

此代码在控制器中传递Movies列表给视图:

public ActionResult Index()
{return View(db.Movies.ToList());
}

 

当您创建电影控制器时,Visual Studio Express会自动包含 @model语句到Index.cshtml文件的顶部:

@model IEnumerable<MvcMovie.Models.Movie>

@model声明使得控制器可以将强类型的电影列表Model对象传递给View视图。例如,在Index.cshtml模板中,在强类型的Model对象上使用foreach语句循环遍历电影列表:

复制代码
@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", { id=item.ID })  |@Html.ActionLink("Delete", "Delete", { id=item.ID }) </td></tr>
}
复制代码

 

因为Model对象是强类型的 (是IEnumerable<Movie>对象),所以在循环中的每个item对象的类型是Movie类型。好处之一是,这意味着您可以在代码编译时进行检查,同时在代码编辑器中支持更加全面的智能感知:

clip_image005

 

使用SQL Server LocalDB

Entity Framework Code First代码优先,如果检测到不存在一个数据库连接字符串指向了Movies数据库,会自动的创建数据库。在App_Data文件夹中找一下,您可以验证它已经被创建了。如果您看不到Movies.mdf文件,请在解决方案资源管理器工具栏上,单击显示所有文件按钮,单击刷新按钮,然后展开App_Data文件夹。

clip_image006

双击Movies.mdf打开数据库资源管理器,然后展开文件夹以查看电影表。

clip_image007

注: 如果没有显示数据库资源管理器,可以从工具菜单中,选择连接到数据库,然后关闭选择数据源对话框。这样将强制打开数据库资源管理器。

注: 如果您使用的 VWD 或 Visual Studio 2010 可能会看到类似下面的错误信息:

· 因为数据库 ' C:\Webs\MVC4\MVCMOVIE\MVCMOVIE\APP_DATA\MOVIES.MDF ' 是 706 版本的,所以无法打开。本服务器支持 655 和更早版本的数据库。无法降级支持。

· "InvalidOperation Exception was unhandled by user code" 所提供的 SqlConnection 没有指定初始数据库。

您需要安装SQL Server 数据工具和LocalDB。并验证在前面所指定的MovieDBContext 连接字符串。

右键单击Movies表并选择显示表数据以查看您所创建的数据。

clip_image008

右键单击Movies表,选择打开表定义查看Entity Framework代码优先所创建表的表结构。

clip_image009

clip_image010

请注意,如何将Movies表的表结构映射到您早些时候所创建的Movie类?Entity Framework 代码优先为您自动创建了基于Movie类的表结构。

当您完成操作后,通过右键单击MovieDBContext ,选择关闭连接关闭该数据库连接。(如果您没有关闭连接,当您下次运行该项目时,可能会出现错误)。

clip_image011

现在,您可以在简单列表页面里,来显示数据库里的数据了。在下一次的教程中,我们会继续看看框架自动生成的其它代码。并添加一个SearchIndex方法和SearchIndex视图,使您可以在数据库中搜索电影了

转载于:https://www.cnblogs.com/zhaoyanqiang/p/3962584.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue双向数据绑定v-model绑定单选框,复选框,下拉框

v-model使用1. 简单的demo2. 三种框的绑定注意它是自动帮你确认值的&#xff01;&#xff01;&#xff01;无需关心过程&#xff0c;把json数据一丢到data中&#xff0c;自动选中。1. 简单的demo 实现一边在输入框输入&#xff0c;一边显示输入框的内容 2. 三种框的绑定 &l…

WebApp基础01-设置读取assets目录下文件

要读取assets下的目录&#xff0c;只需要修改三个地方即可 1.res/layout/activity_main.xml 2.AndroidManifest.xml 3.src\com\example\lcy\MainActivity.java 第一步.res/layout/activity_main.xml加入代码,需要在xml布局文件中声明WebView组件 <WebView android:id"i…

vue借助axios实现网络通信

vue的好处之一&#xff0c;只关注视图层。对于通信&#xff0c;可以在vue实例对象创建前通过mounted钩子函数发送ajax请求&#xff0c;来拿到json数据。 发送请求通过axios&#xff0c;或者jQuery发送。 请求的数据在response对象里面。并绑定到vue对象data方法里。 1. 要访问…

vue自定义组件,插槽,自定义事件

vue组件套娃1. vue自定义组件2. 组件和插槽套娃3. vue组件通过自定义事件更改vue实例中的数据1. vue自定义组件 语法 Vue.component(自定义组件名, {props: [var1, var2, var3], //每个属性可以和页面绑定值template: <p>{{ var1 }}</p> // 自定义模板 里面套htm…

【编程题目】给你 10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数...

第 6 题&#xff08;数组&#xff09;腾讯面试题&#xff1a; 给你 10 分钟时间&#xff0c;根据上排给出十个数&#xff0c;在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下&#xff1a; 【0&#xff0c;1&#xff0c;2&…

vue脚手架v-cli,第一个vue程序

运行在node服务器上的vue程序1. v-cli安装2. 使用webpack构建vue程序3. 目录介绍4. webpack将vue打包成js文件1. v-cli安装 在玩v-cli vue客户端脚手架时&#xff0c;需要安装好node.js&#xff0c;是前端管理js包的工具正式安装vue-cli脚手架 1. npm install vue-cli -g 2. …

Shallow Copy Deep Copy in Python list

今天在写一个小程序的时候用到了2维数组, 顺手就写成了[[0.0]*length]*length, 结果为了这个小错,调试了半个多小时, 其实之前对与浅复制和深复制已经做过学习和总结, 但真正编程用到这些知识时还是掉入了陷阱中. 所以在此做进一步的总结: 本文通过几个实例来说明Python中list的…

python学习之wxPython

1、成功安装wxPython 2、第一个小图形化界面的小程序—创建并显示一个web小框架 参考http://www.cnblogs.com/fnng/archive/2013/05/23/3094033.html #! /usr/bin/env python#codingutf-8import wxappwx.App()winwx.Frame(None)win.Show()app.MainLoop() 3、运行报错 > &qu…

ssh框架搭建

下载地址&#xff1a;源码和详细搭建步骤 使用myeclipse2014搭建ssh框架1. spring搭建2. struts2搭建3. hibernate搭建4. applicationContext编写5. web.xml编写1. spring搭建 创建一个javaweb项目 导入spring框架 最高版本3.1支持 4. 选择类库 spring导入完毕 2. str…

iOS: 图解Xcode常用的快捷键

对于习惯了Windows 操作的开发者来说&#xff0c; 初次接触Xcode时&#xff0c;你会感到有种种不适&#xff0c;其中一个重要的原因就是&#xff0c; 相比Windows X86 电脑&#xff0c; Mac 多出了两个物理键&#xff1a; Fn 和 Command。 尤其是 Command键&#xff0c;在 Ma…

vue参数传递

目标&#xff1a;纯前端vue实现页面跳转restful传值 目录1. 全局路由配置2. 如何传值3. 页面取值1. 全局路由配置 // 路由器主配置文件 import Vue from vue import VueRouter from vue-routerimport Main from ../views/main import Login from ../views/login// 导入用户模块…

adb——Android的ADB工具使用

一、定义与作用&#xff1a; ADB全称Android Debug Bridge, 就是起到调试桥的作用。是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备,默认情况下当我们运行Eclipse时adb进程就会自动运行。当然我们也可以在外部使用本身自带的一些命…

beforeRouteEnter,beforeRouteLeave函数

操作&#xff1a; 是时机函数&#xff0c;在页面加载前&#xff0c;可以在这两个函数里面做一些事情&#xff0c; 比如发送异步请求。 类似过滤器&#xff0c;或者拦截器。1. axios安装 安装报错&#xff0c;多装几遍&#xff0c;或者用cnpm安装 npm install axios -s npm in…

排错“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配”...

问题&#xff1a;在C#给C传数组类型数据时报此错&#xff0c;相应英文信息为“Type could not be marshaled, because the length of an embed array doesnt not match the declared length in the layout” 原因1、声明的数组长度和实际的数组长度不一致&#xff0c;比如声明的…

a标签的href与onclick中使用js的区别

href与onclick中javascript的区别一般没用到都没注意&#xff0c;但出错时才有些郁闷&#xff0c;看文本章解释如下&#xff1a; 以前一直很随意&#xff0c;后来看.net里的linkbutton似乎是用在<a href"javascript:fun();"...>的形式&#xff0c;今天用这种方…

手把手教你搭建springboot程序

spring-boot项目搭建一、从官网搭建1、进入spring官网&#xff0c;快速初始化一个项目2、填写项目基本信息3、项目结构分析4、添加项目依赖5、下载到本地6、解压7、idea&#xff0c;打开&#xff0c;使用maven构建项目8、使用maven构建9、这是构建好的&#xff0c;其它目录全部…

jquery的鼠标移入移出事件hover、mouseenter、mouseleave、mouseover、mouseout

hover:鼠标进入元素的子元素时不会触发‘鼠标移开’的事件&#xff1b;mouseenter、mouseleave&#xff1a;效果与hover相同&#xff1b;mouseover&#xff1a; 鼠标进入元素和进入它的子元素时都会触发‘mouseover’的事件&#xff0c;即使添加了event.stopPropagation();retu…

yaml格式,给Java类绑定数据

这里写目录标题1、基本语法2、给java bean注入值3、测试1、基本语法 # yaml 配置文件写法&#xff0c;代替properties写法 # 严格区分空格# 内注入到配置类中 server:port: 8081# 对象 student:name: jackage: 3# 行内写法 map student1: {name: jack, age: 3}# array or coll…

android编程常见问题- Resource ID #0x7f070001 type #0x12 is not valid

问题说明&#xff1a; AndroidRuntime(1705): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.activitytest/com.example.activitytest.SecondActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x7f070001 type #…