MVC Code First (代码先行)

首先配置好web.config

[html] view plain copy

  1. <connectionStrings>
  2. <add name="BookDbContext" connectionString=" Data Source=.\SQLEXPRESS;Initial Catalog=sales;Persist Security Info=True;Integrated Security=SSPI;"
  3. providerName="System.Data.SqlClient" />
  4. </connectionStrings>

然后在Model里添加一个Book 类和一个BookDbContext类

Book类

[csharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. namespace MvcApplication3.Models
  6. {
  7. public class Book
  8. {
  9. public int BookID { get; set; }
  10. public string BookName { get; set; }
  11. public string Author { get; set; }
  12. public string Publisher { get; set; }
  13. public decimal Price { get; set; }
  14. public string Remark { get; set; }
  15. }
  16. }

BookDbContext类

[csharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Data.Entity;
  6. namespace MvcApplication3.Models
  7. {
  8. /// <summary>
  9. /// BookDbContext代表EF中Book在数据库中的上下文对象,通过DbSet<Book>使实体类与数据库关联起来。Books属性表示数据库中的数据集实体,用来处理数据的存取与更新。BookDbContext派生自DbContext,需要添加System.Data.Entity的引用。
  10. /// </summary>
  11. public class BookDbContext:DbContext
  12. {
  13. /// <summary>
  14. /// 表示用于执行创建、读取、更新和删除操作的类型化实体集。DbSet 不是公共可构造的,只能从 System.Data.Entity.DbContext实例创建。
  15. /// </summary>
  16. public DbSet<Book> Books { get; set; }
  17. }
  18. }

添加一个Book控制器

要了解FormCollection请参考:FormCollection传值

[csharp] view plain copy

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using MvcApplication3.Models;
  7. namespace MvcApplication3.Controllers
  8. {
  9. public class BookController : Controller
  10. {
  11. //
  12. // GET: /Book/
  13. BookDbContext db = new BookDbContext();
  14. /// <summary>
  15. /// //查询出所有的Book对象,组成一个Books,让它展示在页面首页
  16. /// </summary>
  17. /// <returns></returns>
  18. public ActionResult Index()
  19. {
  20. //这是一个简单的Linq查询,在对数据库进行操作时,EF会检查当前的数据连接指定的数据库是否被创建,如果没有则有EF负责根据实体模型类创建数据库、数据表;如果存在,EF会将查询条件添加到Sql查询语句,再将Sql语句发送到数据库进行数据读取。在完成数据读取后,将数据转换为实体对象集合。EF对数据库的操作大致如此
  21. var books = from b in db.Books
  22. select b;
  23. return View(books.ToList());
  24. }
  25. [HttpGet]
  26. public ActionResult Create()
  27. {
  28. return View();
  29. }
  30. [HttpPost]
  31. public ActionResult Create(Book book)
  32. {
  33. //MVC验证中所有属性验证成功ModelState.IsValid等于true,只要有一个验证不成功ModelState.IsValid就等于false 所以我们可以通过该属性来判断数据的有效性,但有时在数据验证时有时我们不需要验证所有的数据,比如登录时只需要验证用户名及密码格式是否输入正确即可。使用以下方法可以排除要验证的字段:ModelState.Remove("Email");不验证Email。这样Email这个字段就不会被验证了,Email验证不通过ModelState.IsValid的值仍然是true
  34. if (ModelState.IsValid)
  35. {
  36. db.Books.Add(book);
  37. db.SaveChanges();
  38. return RedirectToAction("Index");
  39. }
  40. else
  41. {
  42. return View(book);
  43. }
  44. }
  45. [HttpGet]
  46. public ActionResult Delete(int id)
  47. {
  48. var data = from DataItem in db.Books
  49. where DataItem.BookID == id
  50. select DataItem;
  51. ViewData.Model = data.Single();
  52. return View();
  53. }
  54. [HttpPost]
  55. public ActionResult Delete(int id, FormCollection c) //其实这的FormCollection c 换成 int a=5 或者 int a=6 都是可以的。只要保证这个Delete方法与上面的Delete方法参数不同就可以了。其实也就是保证两个方法构成重载
  56. {
  57. //Find()是返回满足条件的第一个元素,如果没有该元素,则返回null。
  58. Book book = db.Books.Find(id); //也可以写成:Book book=db.Books.FirstOrDefault(d=>d.BookID==id)
  59. db.Books.Remove(book);
  60. db.SaveChanges();
  61. return RedirectToAction("Index");
  62. }
  63. public ActionResult Edit(int id)
  64. {
  65. //var data = from dataitem in db.Books
  66. //           where dataitem.BookID == id
  67. //           select dataitem;
  68. //ViewData.Model = data.Single();
  69. //return View();
  70. //Find()是返回满足条件的第一个元素(即:Books中 BookID的的值为id的Book),如果没有该元素,则返回null。
  71. Book book = db.Books.Find(id);
  72. if (book == null)
  73. {
  74. return RedirectToAction("Index");
  75. }
  76. return View(book);
  77. }
  78. [HttpPost]
  79. public ActionResult Edit(Book newbook)
  80. {
  81. try
  82. {
  83. Book oldbook = db.Books.Find(newbook.BookID);
  84. //使用来自控制器的当前值提供程序的值更新指定的模型实例
  85. UpdateModel(oldbook);
  86. //将在此上下文中所做的所有更改保存到基础数据库。
  87. db.SaveChanges();
  88. return RedirectToAction("Index");
  89. }
  90. catch (Exception ex)
  91. {
  92. //AddModelError:将指定的错误消息添加到与指定键关联的模型状态字典的错误集合中。
  93. ModelState.AddModelError("", "修改失败,请查看详细错误信息" + ex.Message + ex.StackTrace);
  94. }
  95. return View(newbook);
  96. }
  97. public ActionResult Details(int id)
  98. {
  99. //Find()是返回满足条件的第一个元素(即:Books中 BookID的的值为id的Book),如果没有该元素,则返回null。
  100. Book book = db.Books.Find(id);
  101. if (book == null)
  102. {
  103. return RedirectToAction("Index");
  104. }
  105. return View(book);
  106. }
  107. }
  108. }

view

Index 视图 首页

[html] view plain copy

  1. @model IEnumerable<MvcApplication3.Models.Book>
  2. @{
  3. ViewBag.Title = "图书列表-MvcBook";
  4. }
  5. <h2>
  6. 图书列表</h2>
  7. <p>
  8. @Html.ActionLink("增加图书", "Create")
  9. </p>
  10. <table>
  11. <tr>
  12. <th>图书名称</th><th>作者</th><th>出版社</th><th>价格</th><th>备注</th>
  13. </tr>
  14. @foreach (var item in Model)
  15. {
  16. <tr>
  17. <td>
  18. @Html.DisplayFor(modelItem => item.BookName)
  19. </td>
  20. <td>
  21. @Html.DisplayFor(modelItem => item.Author)
  22. </td>
  23. <td>
  24. @Html.DisplayFor(modelItem => item.Publisher)
  25. </td>
  26. <td>
  27. @Html.DisplayFor(modelItem => item.Price)
  28. </td>
  29. <td>
  30. @Html.DisplayFor(modelItem => item.Remark)
  31. </td>
  32. <td>
  33. @Html.ActionLink("编辑", "Edit", new { id = item.BookID }) |
  34. @Html.ActionLink("详细", "Details", new { id = item.BookID }) |
  35. @Html.ActionLink("删除", "Delete", new { id = item.BookID })
  36. </td>
  37. </tr>
  38. }
  39. </table>

Create

[html] view plain copy

  1. @model MvcApplication3.Models.Book
  2. @{
  3. ViewBag.Title = "Create";
  4. }
  5. <h2>增加</h2>
  6. @using (Html.BeginForm()) {
  7. @Html.ValidationSummary(true)
  8. <fieldset>
  9. <legend>Book</legend>
  10. <div class="editor-label">
  11. @Html.LabelFor(model => model.BookName)
  12. </div>
  13. <div class="editor-field">
  14. @Html.EditorFor(model => model.BookName)
  15. @Html.ValidationMessageFor(model => model.BookName)
  16. </div>
  17. <div class="editor-label">
  18. @Html.LabelFor(model => model.Author)
  19. </div>
  20. <div class="editor-field">
  21. @Html.EditorFor(model => model.Author)
  22. @Html.ValidationMessageFor(model => model.Author)
  23. </div>
  24. <div class="editor-label">
  25. @Html.LabelFor(model => model.Publisher)
  26. </div>
  27. <div class="editor-field">
  28. @Html.EditorFor(model => model.Publisher)
  29. @Html.ValidationMessageFor(model => model.Publisher)
  30. </div>
  31. <div class="editor-label">
  32. @Html.LabelFor(model => model.Price)
  33. </div>
  34. <div class="editor-field">
  35. @Html.EditorFor(model => model.Price)
  36. @Html.ValidationMessageFor(model => model.Price)
  37. </div>
  38. <div class="editor-label">
  39. @Html.LabelFor(model => model.Remark)
  40. </div>
  41. <div class="editor-field">
  42. @Html.EditorFor(model => model.Remark)
  43. @Html.ValidationMessageFor(model => model.Remark)
  44. </div>
  45. <p>
  46. <input type="submit" value="增加" />
  47. </p>
  48. </fieldset>
  49. }
  50. <div>
  51. @Html.ActionLink("跳转到首页", "Index")
  52. </div>
  53. @section Scripts {
  54. @Scripts.Render("~/bundles/jqueryval")
  55. }

Delete

[html] view plain copy

  1. @model MvcApplication3.Models.Book
  2. @{
  3. ViewBag.Title = "Delete";
  4. }
  5. <h2>Delete</h2>
  6. <h3>Are you sure you want to delete this?</h3>
  7. <fieldset>
  8. <legend>Book</legend>
  9. <table>
  10. <tr><th>图书名称:</th><th>@Html.DisplayFor(model => model.BookName)</th></tr>
  11. <tr><th>作者:</th><th>@Html.DisplayFor(model => model.Author)</th></tr>
  12. <tr><th>出版社:</th><th>@Html.DisplayFor(model => model.Publisher)</th></tr>
  13. <tr><th>价格:</th><th>@Html.DisplayFor(model => model.Price)</th></tr>
  14. <tr><th>备注</th><th>@Html.DisplayFor(model => model.Remark)</th></tr>
  15. </table>
  16. </fieldset>
  17. @using (Html.BeginForm()) {
  18. <p>
  19. <input type="submit" value="删除" /> |
  20. @Html.ActionLink("跳转到首页", "Index")
  21. </p>
  22. }

Edit

[html] view plain copy

  1. @model MvcApplication3.Models.Book
  2. @{
  3. ViewBag.Title = "Edit";
  4. }
  5. <h2>编辑</h2>
  6. @using (Html.BeginForm()) {
  7. @Html.ValidationSummary(true)
  8. <fieldset>
  9. <legend>Book</legend>
  10. @Html.HiddenFor(model => model.BookID)
  11. <div class="editor-label">
  12. @Html.LabelFor(model => model.BookName)
  13. </div>
  14. <div class="editor-field">
  15. @Html.EditorFor(model => model.BookName)
  16. @Html.ValidationMessageFor(model => model.BookName)
  17. </div>
  18. <div class="editor-label">
  19. @Html.LabelFor(model => model.Author)
  20. </div>
  21. <div class="editor-field">
  22. @Html.EditorFor(model => model.Author)
  23. @Html.ValidationMessageFor(model => model.Author)
  24. </div>
  25. <div class="editor-label">
  26. @Html.LabelFor(model => model.Publisher)
  27. </div>
  28. <div class="editor-field">
  29. @Html.EditorFor(model => model.Publisher)
  30. @Html.ValidationMessageFor(model => model.Publisher)
  31. </div>
  32. <div class="editor-label">
  33. @Html.LabelFor(model => model.Price)
  34. </div>
  35. <div class="editor-field">
  36. @Html.EditorFor(model => model.Price)
  37. @Html.ValidationMessageFor(model => model.Price)
  38. </div>
  39. <div class="editor-label">
  40. @Html.LabelFor(model => model.Remark)
  41. </div>
  42. <div class="editor-field">
  43. @Html.EditorFor(model => model.Remark)
  44. @Html.ValidationMessageFor(model => model.Remark)
  45. </div>
  46. <p>
  47. <input type="submit" value="保存" />
  48. </p>
  49. </fieldset>
  50. }
  51. <div>
  52. @Html.ActionLink("跳转到首页", "Index")
  53. </div>
  54. @section Scripts {
  55. @Scripts.Render("~/bundles/jqueryval")
  56. }

Details

[html] view plain copy

  1. @model MvcApplication3.Models.Book
  2. @{
  3. ViewBag.Title = "Details";
  4. }
  5. <h2>Details</h2>
  6. <fieldset>
  7. <legend>Book</legend>
  8. <table>
  9. <tr><th>图书名称:</th><th>@Html.DisplayFor(model => model.BookName)</th></tr>
  10. <tr><th>作者:</th><th>@Html.DisplayFor(model => model.Author)</th></tr>
  11. <tr><th>出版社:</th><th>@Html.DisplayFor(model => model.Publisher)</th></tr>
  12. <tr><th>价格:</th><th>@Html.DisplayFor(model => model.Price)</th></tr>
  13. <tr><th>备注</th><th>@Html.DisplayFor(model => model.Remark)</th></tr>
  14. </table>
  15. </fieldset>
  16. <p>
  17. @Html.ActionLink("编辑", "Edit", new { id=Model.BookID }) |
  18. @Html.ActionLink("跳转到首页", "Index")
  19. </p>

时间: 2024-10-22 21:37:42

MVC Code First (代码先行)的相关文章

MVC Code First (代码优先)

首先配置web.config <connectionStrings> <add name="BookDbContext" connectionString=" Data Source=.\SQLEXPRESS;Initial Catalog=sales;Persist Security Info=True;Integrated Security=SSPI;" providerName="System.Data.SqlClient"

ASP.NET MVC Code First 遇到的问题及解决方法

照抄大牛的Demo,自己信心满满地建好个各种项,结果死活不让通过,遇到了以下几个问题(大部分是自己作出来的...) 1.运行不起来,报错如下Error 26: SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) 各种百度都是不行,后来看了一下,WebConfig的连接字符串是新加而

Effective Java提升Code Coverage代码涵盖率 - 就是爱Java

虽然我们已经有了测试程序,但是如何得知是否已完整测试了主程序?,透过Code Coverage代码涵盖率,我们可以快速地得知,目前系统中,有多少程序中被测试过,不考虑成本跟投资效益比,涵盖率越高,代表系统如预期正常运作的面向也越广泛. 阅读全文>>

Asp.net mvc 5 CRUD代码自动生成工具- vs.net 2013 Saffolding功能扩展

Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个<Asp.net webform scaffolding结合Generic Unit of Work & (Extensible) Repositories Framework代码生成向导> 是生存Web Form的. 这次看到网上有生成MVC Saffolding扩展原作者的代码 https://github.com/robinli/MVC5-

第五次作业2、请将该code进行代码重构,使之模块化,并易于阅读和维护;

1.请运行下面code,指出其功能: (需附运行结果截图,并用简短文字描述其功能) 显示了人的姓名.年龄 2.请将该code进行代码重构,使之模块化,并易于阅读和维护: 3.观看视频The Expert (Short Comedy Sketch),写出观后感(内容是什么,说明了什么问题,有什么启示),提交到博客! The Expert (Short Comedy Sketch)内容是:一个工程师在一群完全什么技术都不懂的CEO,产品经理和设计师面前…… 说明了什么问题,有什么启示: 看了这个视频

VS code调试代码快速上手必备知识

一.通过简单的配置运行一个JavaScript程序 1.打开(创建)一个新的工作空间(文件夹),并创建一个js文件: var name='world'; var s='Hello,${name}!'; console.log(s); 2.点击调试后会提示需要配置: 点击后会自动生成一个json配置文件,之后将默认启动文件名修改为你刚创建的文件名: Ctrl+S保存json配置文件,之后就可以调试(运行)你写的javascript程序来. 二.使用VS code调试代码的一些常识,launch.j

Web MVC开发程序代码的简写方法,强类型数据和Html helper使用方法。车老师代码

控制器代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using MvcApplication1.Models; using System.IO; namespace MvcApplication1.Controllers { public class HomeController : Controller { public

EF之Code First代码优先

1.前言 通过英文可知,表示的是代码优先,一般创建EF都是先创建数据库,创建根据数据库的EF实体模型,而code - first 则是反过来!... 2.代码实战 我们这次创建的不是原来的数据库EF设计器,而是空的Code first 模型.如果说你的项目引用中没有entity framkwork,则需要去nuget程序包中安装ef框架(entity) 创建一个类,这个类就是数据的上下文,它的目录在MVC项目中的Model文件夹,base中的是你所创建的数据库名称,而你创建的表也是在model的

MVC Code First 自动生成数据库时生成的表名会多了一个s

如图:我的类文件都是不带s的 但是生成了的数据库表却是带了s的,如下图: 因为code first默认了就会加上s,解决方法: 在上下文文件中加入这段代码: protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } 如图所示: