活到老学到老,最近开始学习MVC。写点学习笔记加深点影响,废话不多说开始正题。
- 在本地数据库建立数据库“zhb”
数据库中没有表。
- 建立解决方案“MvcApplication1” 。在“Models”建立一个实体类“Person”,并新建一个继承”DbContext“的“DBperson”类。在代码中做了很好的注释。代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.ComponentModel.DataAnnotations; 6 using System.Data.Entity; 7 using System.ComponentModel.DataAnnotations.Schema; 8 9 10 namespace MvcApplication1.Models 11 { 12 // [Table("Person")] 的作用是防止在EF生成SQL语句的时候变成复数的形式。 命名空间是在using System.ComponentModel.DataAnnotations.Schema; 13 [Table("Person")] 14 /// 实体类Person 15 public class Person 16 { 17 [Key] 18 // [Key]个人认为的是主键的一生。这个属性的命名空间是在System.ComponentModel.DataAnnotations; 19 // 默认的情况下是没有引入到文档中的,要自己引入 20 public int pid { set; get; } 21 // 年龄 22 public int age { set; get; } 23 // 名称 24 public string name { set; get; } 25 } 26 27 /// <summary> 28 /// 上下文类 继承DbContest 29 /// </summary> 30 public class DBperson:DbContext 31 { 32 /// <summary> 33 /// 构造函数 base("zzz") “zzz” 是我连接字符串的name 连接字符串如下。 也可以使用base("name=zzz") 看个人喜欢 34 /// <add name="zzz"connectionString="Data Source=127.0.0.1;Initial Catalog=zhb;uid=sa;pwd=123456789;" providerName="System.Data.SqlClient"/> 35 /// </summary> 36 public DBperson():base("zzz") 37 { 38 } 39 /// <summary> 40 /// 定义变量dperson 41 /// </summary> 42 public DbSet<Person> dperson { set; get; } 43 } 44 }
到此为止实体类建设好了。在数据库中现在还没有Person表。
- 到建立控制器了。代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using MvcApplication1.Models; 7 using System.Data.Entity; 8 9 namespace MvcApplication1.Controllers 10 { 11 public class PersonController : Controller 12 { 13 // 14 // GET: /Person/ 15 // 实例化一个DBperson 16 DBperson db=new DBperson(); 17 public ActionResult Index() 18 { 19 // 返回所有的数据。现在数据库中还没有person表。在运行过后,会添加好这个表。这就是所谓的CODER first。 20 // 添加视图 视图实体是 Person。当你选择模板是LIST时系统会自动填充好很多代码 21 return View(db.dperson.ToList()); 22 } 23 24 [HttpGet] 25 public ActionResult Create() 26 { 27 //返回到Cre页面ate 28 return View("Create"); 29 } 30 31 [HttpPost] 32 public ActionResult Create(Person person) 33 { 34 // 提交新建的数据 35 36 if (ModelState.IsValid)// 判断是合法有效的数据 37 { 38 db.dperson.Add(person);// 添加数据 39 db.SaveChanges();// 保存数据 40 return RedirectToAction("Index");//跳转到INdex 控制器 41 } 42 else 43 { 44 return View("Create");// 不成功 返回Create 一米爱你 45 } 46 47 } 48 49 public ActionResult Edit(int id) 50 { 51 Person person = db.dperson.Find(id);// 通过ID 找到实体 52 if (person != null)// 判断是否存在 53 { 54 return View("Edit", person);// 吧Person 实体返回到页面 55 } 56 else 57 { 58 return RedirectToAction("Index");//没有找打就返回到index 59 } 60 } 61 [HttpPost] 62 public ActionResult Edit(Person p)// 参数名 要和前台的参数名一直。否则会报错。默认是ID 63 { 64 db.Entry(p).State = EntityState.Modified;// 更改的状态 65 db.SaveChanges();//报错 66 return View("Index",db.dperson.ToList());// 返回页面 67 } 68 69 70 71 72 73 } 74 }
控制器建好了。
- 建立视图。代码如下:
@model IEnumerable<MvcApplication1.Models.Person> @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <p> @Html.ActionLink("Create New", "Create") </p> <table> <tr> <th> @Html.DisplayNameFor(model => model.age) </th> <th> @Html.DisplayNameFor(model => model.name) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.age) </td> <td> @Html.DisplayFor(modelItem => item.name) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.pid }) | @Html.ActionLink("Details", "Details", new { id=item.pid }) | @Html.ActionLink("Delete", "Delete", new { id=item.pid }) </td> </tr> } </table> </body> </html>
@model MvcApplication1.Models.Person @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Edit</title> </head> <body> <script src="~/Scripts/jquery-1.7.1.min.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Person</legend> @Html.HiddenFor(model => model.pid) <div class="editor-label"> @Html.LabelFor(model => model.age) </div> <div class="editor-field"> @Html.EditorFor(model => model.age) @Html.ValidationMessageFor(model => model.age) </div> <div class="editor-label"> @Html.LabelFor(model => model.name) </div> <div class="editor-field"> @Html.EditorFor(model => model.name) @Html.ValidationMessageFor(model => model.name) </div> <p> <input type="submit" value="Save" /> </p> </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div> </body> </html>
@model MvcApplication1.Models.Person @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Create</title> </head> <body> <script src="~/Scripts/jquery-1.7.1.min.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>Person</legend> <div class="editor-label"> @Html.LabelFor(model => model.age) </div> <div class="editor-field"> @Html.EditorFor(model => model.age) @Html.ValidationMessageFor(model => model.age) </div> <div class="editor-label"> @Html.LabelFor(model => model.name) </div> <div class="editor-field"> @Html.EditorFor(model => model.name) @Html.ValidationMessageFor(model => model.name) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div> </body> </html>
视图建好
- 配置下默认的路由,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MvcApplication1 { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Tbadmin", url: "{controller}/{action}/{id}", defaults: new { controller = "Person", action = "Index", id = UrlParameter.Optional } ); } } }
- 可以F5运行了。结果是为“zhb”新建了一个表,如果变已经存在,则不会有影响。能够添加修改。