它是ASP.NET的一个特性,它允许我们快速生成函数代码。它也被称为代码生成器框架。它预装在Visual Studio 2013和更高版本中。
要创建基本的CRUD应用程序,搭建是最佳选择。它减少了时间,产生干净的代码。在这里,我们使用scaffolding来开发CRUD应用程序。
ASP.NET的CRUD的例子
这个示例包含以下几个步骤。
创建新项目
选择文件菜单从菜单栏和选择新->
项目。我们也可以使用快捷键Ctrl+Shift+N来创建一个新项目。
文章图片
这将弹出一个包含项目的窗口。我们选择ASP.NET的Web应用程序。
文章图片
单击ok后,它会弹出一个新的模板窗口。在这里,我们选择MVC模板,用于创建MVC web应用程序。
文章图片
点击确定,然后它将创建一个项目,并显示一个进度条,如下所示。
文章图片
CRUD项目结构
文章图片
我们可以通过按Ctrl+F5来运行这个应用程序。它将为浏览器生成一个默认的索引页,如下所示。
文章图片
为了创建完整的crud,我们需要在项目中添加模型、视图和控制器。这里,我们创建一个处理数据的模型。
创建一个新模型
我们正在项目的Models文件夹中创建一个Student模型。右键单击Models文件夹并选择add-> 类,将弹出一个对话框。通过提供名称来创建类。
文章图片
这个模型类有一些源代码,可以像下面这样修改它的代码。
/ / Student.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace CrudExample.Models
{
public class Student
{
public int ID { get;
set;
}
[Required]
public string Name { get;
set;
}
[Required]
[EmailAddress]
public string Email { get;
set;
}
[Required]
public string Contact { get;
set;
}
}
}
创建一个上下文类
我们在Models文件夹中创建了另一个类,它用于与实体框架通信并执行数据库操作。这个类继承了DbContext类。
/ / StudentRecord.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.Entity;
namespace CrudExample.Models
{
public class StudentRecord : DbContext
{
public DbSet<
Student> Students { get;
set;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<
PluralizingTableNameConvention>();
}
}
}
将脚手架添加到项目中
右键单击Controllers文件夹并添加脚手架,就像我们在屏幕截图中所做的那样。
文章图片
它将弹出以下对话框。选择带有实体框架的控制器。
文章图片
然后点击添加按钮。它请求模型和上下文名称。填写条目并单击ok。
文章图片
单击add按钮后,它将创建一个StudentsController控制器和一个Students文件夹。学生文件夹包含每个CRUD操作的web页面。
【asp.net mvc脚手架】/ / StudentsController.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using CrudExample.Models;
namespace CrudExample.Controllers
{
public class StudentsController : Controller
{
private StudentRecord db = newStudentRecord();
// GET: Students
public ActionResult Index()
{
return View(db.Students.ToList());
}
// GET: Students/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}
// GET: Students/Create
public ActionResult Create()
{
return View();
}
// POST: Students/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,Name,Email,Contact")] Student student)
{
if (ModelState.IsValid)
{
db.Students.Add(student);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(student);
}
// GET: Students/Edit/5
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}
// POST: Students/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,Name,Email,Contact")] Student student)
{
if (ModelState.IsValid)
{
db.Entry(student).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(student);
}
// GET: Students/Delete/5
public ActionResult Delete(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}
// POST: Students/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
Student student = db.Students.Find(id);
db.Students.Remove(student);
db.SaveChanges();
return RedirectToAction("Index");
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
}
视图中的Students文件夹包含以下文件。
文章图片
Index.cshtml文件包含以下代码。
/ / Index.cshtml
@model IEnumerable<
scaffoldingTest.Models.Student>
@{
ViewBag.Title = "Index";
}
<
h2>Index<
/h2>
<
p>
@Html.ActionLink("Create New", "Create")
<
/p>
<
table class="table">
<
tr>
<
th>
@Html.DisplayNameFor(model => model.Name)
<
/th>
<
th>
@Html.DisplayNameFor(model => model.Email)
<
/th>
<
th>
@Html.DisplayNameFor(model => model.Contact)
<
/th>
<
th><
/th>
<
/tr>
@foreach (var item in Model) {
<
tr>
<
td>
@Html.DisplayFor(modelItem => item.Name)
<
/td>
<
td>
@Html.DisplayFor(modelItem => item.Email)
<
/td>
<
td>
@Html.DisplayFor(modelItem => item.Contact)
<
/td>
<
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>
}
<
/table>
输出:
右击Index.cshtml文件,并选择“查看在浏览器”,这将执行文件,并产生以下输出。
/ /index文件
此索引文件用于显示学生记录。当前表是空的,所以它不显示任何数据。
文章图片
添加新的学生
我们可以通过点击Create new按钮来添加新学生。这将重定向到学生表单。
文章图片
添加它之后,我们又添加了两个条目,然后重定向回索引文件。现在,它包含三个学生记录。
文章图片
更新记录
我们可以通过点击编辑按钮来更新记录。这将重定向到更新表单。下面的屏幕截图显示了编辑页面。
文章图片
更新记录索引页后,如下所示
文章图片
删除记录
我们可以简单地通过点击提供的删除链接来删除任何记录。让我们把罗曼·约翰从表中删除。确认消息将显示给用户以确定。
文章图片
文章图片
推荐阅读
- asp.net mvc ViewData、ViewBag和TempData
- asp.net mvc验证
- asp.net mvc路由
- asp.net mvc boostrap框架
- asp.net mvc身份验证
- asp.net mvc entity框架
- asp.net mvc视图
- asp.net mvc模型绑定
- asp.net mvc模型