【第⼀篇】ASP.NETMVC快速⼊门之数据库操作
(MVC5+EF6)
新建项⽬
打开VS2015,到菜单项[⽂件->新建->项⽬],打开向导对话框:
注意我们的选择项:
1. 运⾏平台:.NET FrameWork 4.5
2. 项⽬模板:ASP.NET Web Application (.NET Framework)
3. 项⽬名称:AspNetMvc.QuickStart,如果你在跟着本教程练习,建议起相同的项⽬名称,⽅便直接拷贝代码到你的项⽬中。点击[确定]按钮,向导会带我们到另⼀个选择对话框:
由于本教程是快速⼊门,所以我们从最简单的⼊⼿,只勾选必需的选项:
1. 不进⾏⾝份验证。ASP.NET MVC提供了完善的⾝份验证⽅案,我们会有单独的⽂章讲解。
2. 仅勾选 MVC 引⽤。
点击[确定],VS2015会创建⼀个可直接运⾏的项⽬,按下快捷键[Ctrl+F5],不调试直接运⾏:
默认的⽬录结构如下:
aspnet和net的区别如果你之前在WebForms下进⾏开发,对其中的⼀些⽂件夹和⽂件应该很熟悉了:
1. fig:项⽬配置⽂件,⾥⾯保存项⽬配置参数以及数据库连接字符串。
2. fig:Nuget配置⽂件
3. Global.asax:全局代码⽂件,提供应⽤程序级别以及会话级别的事件处理函数,可以在Application_Start中注册全局变量。
4. favicon.ico:浏览器地址栏图标,在HTML的head标签中引⽤。
5. App_Data:放置本地数据库⽂件,⽐如LocalDB⽣成的数据库⽂件。
下⾯⼏个⽂件夹,⽤来放置静态⽂件,从名称就可以⽅便的猜出其⽤途:
1. Scripts:放置静态脚本⽂件,⽐如jQuery等。
2. fonts:放置图标字体⽂件,⽐如流⾏的FontAwesome字体等。
3. Content:放置静态⽂件,⽐如xml⽂件、Bootstrap的CSS库。
下⾯⼏个⽂件是ASP.NET MVC新引⼊的:
1. App_Start:⽤来放置应⽤初始化类,这个是MVC4引⼊的⼀个命名约定,其实这就是⼀个普通的⽂件夹,没有特殊的含义。
2. Controllers:控制器类。
3. Models:模型类,⽐如EF CodeFirst的模型定义。
4. Views:视图⽂件,最初的视图引擎是WebForms View Engine,使⽤和ASPX⽂件相同的语法,⽽现在⽤的Razor视图引擎是
MVC3引⼊的,以cshtml为后缀。
页⾯流程
⾸先看下 [About]页⾯:
这个页⾯之所以能够呈现在我们眼前,经历了三个主要流程:
1. MVC的路由引擎根据URL查相应的控制器(HomeController.cs)。
2. 控制器的操作⽅法About准备数据,然后传⼊视图Home/About.cshtml。
3. 视图准备HTML⽚段,放⼊布局页⾯并返回浏览器。
路由引擎->控制器
⼀切还得从Global.asax中说起,在其中的应⽤程序启⽤事件中,我们需要注册路由处理器:
protected void Application_Start(){ AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles);}
RouteConfig.cs类位于App_Start⽂件夹中,我们来看下内容:
public class RouteConfig{ public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Defa
ult", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }}
这⾥注册⼀个名为Default的路由规则,对应的URL是{controller}/{action}/{id},这⾥三个占位符分别表⽰:
1. {controller}:控制器,默认是Home,对应的控制器类是HomeController.cs。
3. {id}:参数ID,可选项,这个参数对应于操作⽅法中的id参数。
控制器⽅法->视图
我们在Controllers/HomeController.cs中到相应的⽅法:
public ActionResult About(){ ViewBag.Message = "Your application description page."; return View();}
ViewBag是⼀个动态对象(dynamic),可以⽤来存储任意参数,⽤来从控制器向视图传递数据。
从控制器向视图传递数据⼀般有两种⽅法:
1. 传⼊模型,然后在视图中通过Model对象访问,这是⼀种强类型的⽅式,也是推荐的做法。其局限性就是只能传⼊⼀个模型,如果需要传⼊多个模型对象,就需要⾃定义类来包含多个模型,另⼀种⽅法就是ViewBag。
2. ViewBag,视图包传递数据⾮常⽅便,但是在视图中可能需要进⾏强制类型转换。在常见的传⼊⼀个主模型和多个次模型时,可以把多次模型放到ViewBag中,从⽽避免⾃定义类的⿇烦。
作为命名约定,这个操作⽅法会⾃动调⽤相应名称的视图⽂件About.cshtml。
视图->浏览器
下⾯来看About.cshtml视图⽂件:
@{ ViewBag.Title = "About";}<h2>@ViewBag.Title.</h2><h3>@ViewBag.Message</h3><p>Use this area to provide additional information.</p>
以@开头⽤来输出C#代码的运⾏结果,MVC会⾃动判断于何处结束C#代码,并转⼊HTML代码。
需要注意,页⾯第⼀⾏的@{ }⽤来执⾏⼀段C#代码,不会输出内容,这⾥定义了⼀个ViewBag.Title的变量,并在下⾯的代码中使⽤
@ViewBag.Title输出到页⾯中。
很多初学者可能有些疑惑,为啥控制器中定义了ViewBag.Message,⽽在视图中定义了ViewBag.Title,这两者有啥区别?
⼀般来说是没有功能的区别,仅仅是语义的区别。在视图中定义的变量仅在视图中使⽤,⽐如这⾥定义的ViewBag.Title不仅在
About.cshtml中使⽤,⽽且在布局视图Shared/_Layout.cshtml中也⽤到了。
布局视图
布局视图类似于WebForms中的母版页,具体的视图页⾯会作为⼀部分嵌⼊到布局视图中,然后返回到浏览器形成⼀个完整的页⾯。
每⼀个视图页⾯默认会使⽤Views/_ViewStart.cshtml中的定义的内容:
@{ Layout = "~/Views/Shared/_Layout.cshtml";}
这⾥⾯指定了布局视图的位置,我们来简单看下布局视图的内容:
<!DOCTYPE html><html><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - My ASP.NET Application</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr")</head><body>
<div class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><span class="icon-bar"></span><span
class="icon-bar"></span><span class="icon-bar"></span></button> @Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" }) </div><div class="navbar-collapse collapse"><ul class="nav
navbar-nav"><li>@Html.ActionLink("Home", "Index", "Home")</li><li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li></ul></div></div></div><div class="container body-content">
@RenderBody() <hr /><footer><p>© @DateTime.Now.Year - My ASP.NET Application</p></footer></div>
@Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false)</body></html>
其中head标签下⾯的title中使⽤了在About视图中定义的ViewBag.Title属性。
这个布局视图使⽤Bootstrap库定义的CSS样式来完成,包含标题栏,导航菜单,以及页脚的定义,具体的内容会嵌⼊@RenderBody()的地⽅,最终形成完整的HTML页⾯返回。
数据库操作
上⾯从控制器传⼊视图的数据是硬编码的⼀个字符串,实际项⽬中则经常需要从数据库中读取数据,我们使⽤微软推荐的Entity
Framework CodeFirst开发模式来创建和使⽤数据库。
安装Entity Framework
⾸先需要安装EF,在VS2015中到[⼯具]菜单,然后到NuGet包管理器:
转到[浏览]选项卡,可以搜索Entity Framework,安装其最新稳定版到项⽬中:
安装后,会⾃动更改fig添加相应的配置信息。
创建模型
我们计划完成⼀个简单的学⽣管理系统,包含基本的增删改查(CRUD)。
⾸先在Models⽂件,创建学⽣(Student)的模型类:
public class Student{ public int ID { get; set; } public string Name { get; set; } public int Gender { get; set; } public string Major { get; set; } public DateTime EntranceDate { get; set; }}
然后创建数据库操作上下⽂,EF需要这个⽂件来创建和访问数据库:
public class StudentDbContext : DbContext{ public DbSet<Student> Students { get; set; }}
由于这个类继承⾃EF的DbContext基类,因此需要在⽂件头部添加如下引⽤:
using System.Data.Entity;
创建完这两个⽂件,需要重新编译项⽬(快捷键Ctrl+Shift+B),否则下⾯添加控制器时会出错。
添加控制器
在Controllers⽬录上点击右键,添加控制器,弹出向导对话框:
这⾥选择 MVC 5 Controller with views, using Entity Framework,然后进⼊设置对话框:
在这个对话框中,我们需要指定刚才创建的模型类(Student)和数据访问上下⽂类(StudentDbContext),然后VS不仅可以⾃动创建视图,⽽且使⽤EF⾃动创建CRUD的全部代码,是不是很酷!
全部功能完成了!
是不是很惊奇,我们甚⾄没来得及写视图代码,没有配置数据库,没有写CRUD的逻辑代码,VS模板帮我们⽣成了⼀切,现在运⾏⼀下(Ctrl+F5),并在浏览器中输⼊/Students:
表格页⾯
表格页⾯对应于Students控制器下的Index操作⽅法:
public class StudentsController : Controller{ private StudentDbContext db = new StudentDbConte
xt(); // GET: Students public ActionResult Index() { return View(db.Students.ToList()); } }
⾸先,我们看到控制器内部定义了⼀个私有变量db,并进⾏初始化。这是数据库操作上下⽂实例,所有的CRUD操作都讲依赖于这个实例。
在Index⽅法中,通过向View⽅法传递学⽣列表的⽅式,把模型数据传递到了视图,在Views/Students/Index.cshtml视图⽂件中,我们声明了传⼊模型的类型:
@model IEnumerable<AspNetMvc.QuickStart.Models.Student>
在视图中,Model属性的类型就确定为强类型IEnumrable<Student>,配合VS提供的智能感知,不仅可以快速编写代码,并且在编译时还检查代码的有效性。
完整的Index.cshtml代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论