目录

介绍

背景

使用代码

创建项目

更改Razor视图

添加数据模型

向应用程序添加数据

安装实体框架核心包

定义连接字符串

创建数据库上下文类

配置实体框架核心

创建存储库

创建数据库迁移

创建种子数据

显示书籍列表

准备控制器

更新视图

运行应用程序

兴趣点


介绍

要从这些文章中获得最大收益,您应该熟悉Web开发的基础知识,了解HTML、CSS和JavaScript的工作原理,了解C#、什么是MVC模型,并且还应该了解一些基础知识.NET Core、ASP.NET Core和Entity Framework Core。如果您还没有做过这些,您可以从W3schools或Microsoft docs开始使用它们。

在这些文章中,通过一个名为BooksStore的项目,我想向您展示一个从开始到部署的真实开发过程。我使用了Windows 10、Visual Studio 2019和SQL Server LocalDB。

背景

在我的应用程序中BooksStore,我将创建一个客户可以按类型和页面浏览的在线图书目录,一个用户可以添加和删除图书的购物车,以及一个客户可以输入他们的运输详细信息的结帐。我还将创建一个管理区域,其中包括用于管理目录的创建、读取、更新和删除(CRUD)工具,并且我将保护它,以便只有登录的管理员才能进行更改。

使用代码

创建项目

在Visual Studio中,选择Create a new project,选择ASP.NET Core Web ApplicationNext

为项目命名BooksStore并选择Create

选择Web应用程序(模型-视图-控制器),然后选择创建

请注意,我选择了ASP.NET Core 3.1——Visual Studio 2019中的长期支持。

更改Razor视图

Razor视图引擎负责处理扩展名为.cshtml的视图文件以生成HTML响应。将Views/Shared/_Layout.cshtml文件的内容替换为以下标记:

<!DOCTYPE html>
<html>
<head><meta name="viewport" content="width=device-width" /><title>BooksStore</title>
</head>
<body><div>@RenderBody()</div>
</body>
</html>

并且还将Views/Home /Index.cshtml文件的内容替换为以下标记:

<h3>Welcome to BooksStore</h3>

添加数据模型

由于这是一个电子商务应用程序,我需要的最明显的模型是一本书。在Models文件夹中添加一个名为Book.cs的类文件,并将该文件的默认内容替换为以下代码:

using System.ComponentModel.DataAnnotations.Schema;namespace BooksStore.Models {public class Book {public long BookID { get; set; }public string Title { get; set; }public string Description { get; set; }[Column(TypeName = "decimal(8, 2)")]public decimal Price { get; set; }public string Genre { get; set; }}
}

现在,在继续之前,我们可以运行应用程序以确保它按预期构建和运行:

向应用程序添加数据

安装实体框架核心包

该BooksStore应用程序将其数据存储在SQL Server LocalDB数据库中,该数据库使用Entity Framework Core(EF Core)进行访问。因此,第一步是通过选择工具菜单,选择NuGet包管理器>包管理器控制台(PMC)将EF Core添加到项目中。在PMC中,运行以下命令:

Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 3.1.1

定义连接字符串

配置设置(例如数据库连接字符串)存储在JSON配置文件中。将连接字符串添加到appsettings.json文件:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","ConnectionStrings": {"BooksStoreConnection": "Server=(localdb)\\MSSQLLocalDB;Database=BooksStore;MultipleActiveResultSets=true"}
}

此配置字符串指定一个名为BooksStore的LocalDB数据库并启用多活动结果集功能(MARS),这是BooksStore应用程序使用Entity Framework Core进行的一些数据库查询所必需的。

创建数据库上下文类

Entity Framework Core通过上下文类提供对数据库的访问。将一个名为BooksStoreDbContext.cs的类文件添加到Models文件夹,并使用它来定义具有以下代码的类:

using Microsoft.EntityFrameworkCore;namespace BooksStore.Models {public class BooksStoreDbContext: DbContext {public BooksStoreDbContext (DbContextOptions< BooksStoreDbContext > options): base(options) { }public DbSet<Book> Books { get; set; }}
}

DbContext基类提供对Entity Framework Core底层功能的访问,而Books属性将提供Book对数据库中对象的访问。该类BooksStoreDbContext派生自DbContext并添加了将用于读取和写入应用程序数据的属性。

配置实体框架核心

必须配置Entity Framework Core,以便它知道它将连接到的数据库的类型,哪个连接字符串描述该连接,以及哪个上下文类将在数据库中呈现数据。为此,我们对Startup.cs文件进行一些更改:

using BooksStore.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
...
public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();services.AddDbContext<BooksStoreDbContext>(opts => {opts.UseSqlServer(Configuration["ConnectionStrings:BooksStoreConnection"]);});}
...

Entity Framework Core配置AddDbContext方法,注册数据库上下文类,配置与数据库的关系。

该UseSQLServer方法声明正在使用SQL Server,并通过IConfiguration对象读取连接字符串。

创建存储库

下一步是创建存储库接口和实现类。存储库模式是使用最广泛的模式之一,它提供了一种一致的方式来访问数据库上下文类提供的功能。

Models文件夹中添加一个名为IBooksStoreRepository.cs的类文件,并使用它来定义接口,代码如下:

using System.Linq;namespace BooksStore.Models {public interface IBooksStoreRepository {IQueryable<Book> Books { get; }}
}

此接口使用IQueryable<T>允许调用者获取Book对象序列。

要创建存储库接口的实现,请在Models文件夹中添加一个名为EFBooksStoreRepository.cs的类文件,并使用它来定义具有以下代码的类:

using System.Linq;namespace BooksStore.Models {public class EFBooksStoreRepository : IBooksStoreRepository {private BooksStoreDbContext context;public EFBooksStoreRepository (BooksStoreDbContext ctx) {context = ctx;}public IQueryable<Book> Books => context.Books;}
}

现在,我们将在Startup类中添加以下语句,为用作实现EFBooksStoreRepository类的IBooksStoreRepository接口创建服务:

public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();services.AddDbContext<BooksStoreDbContext>(opts => {opts.UseSqlServer(Configuration["ConnectionStrings:BooksStoreConnection"]);});services.AddScoped<IBooksStoreRepository, EFBooksStoreRepository>();}

该AddScoped方法创建一个服务,其中每个HTTP请求都获取自己的存储库对象,这是Entity Framework Core通常使用的方式。

创建数据库迁移

Entity Framework Core能够通过称为迁移的功能使用数据模型类为数据库生成架构。从“工具”菜单中,选择NuGet包管理器>包管理器控制台(PMC)。在PMC中,输入以下命令:

Install-Package Microsoft.EntityFrameworkCore.Tools -Version 3.1.1
Add-Migration InitialCreate
Update-Database

我们使用该Add-Migration命令创建数据库迁移并使用该Update-Database命令将其应用到数据库。我们还从nuget安装了Microsoft.EntityFrameworkCore.Tools软件包以使用这些命令。

创建种子数据

为了填充数据库并提供一些示例数据,我在Models文件夹中添加了一个名为SeedData.cs的类文件,并使用以下代码定义了该类:

using System.Linq;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;namespace BooksStore.Models
{public static class SeedData{public static void EnsurePopulated(IApplicationBuilder app){BooksStoreDbContext context = app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService<BooksStoreDBContext>();if (context.Database.GetPendingMigrations().Any()){context.Database.Migrate();}if (!context.Books.Any()){context.Books.AddRange(new Book{Title = "Atomic Habits",Description = "An Easy & Proven Way to Build Good Habits & Break Bad Ones",Genre = "Self-Help",Price = 11.98m},new Book{Title = "How to Win Friends & Influence People",Description = "You can go after the job you want...and get it! You can take the job you have...and improve it!",Genre = "Self-Help",Price = 17.46m},new Book{Title = "Rich Dad Poor Dad",Description = "What the Rich Teach Their Kids About Money That the Poor and Middle Class Do Not!",Genre = "Personal Finance",Price = 13.41m},new Book{Title = "The Psychology of Money",Description = "Doing well with money isn’t necessarily about what you know. It’s about how you behave. And behavior is hard to teach, even to really smart people.",Genre = "Money Management",Price = 18.69m},new Book{Title = "48 Laws of Power",Description = "Amoral, cunning, ruthless, and instructive, this piercing work distills 3,000 years of the history of power into 48 well-explicated laws.",Genre = "Political Science",Price = 31.26m});context.SaveChanges();}}}
}

最后的更改是在应用程序启动时为数据库播种,我们通过使用以下代码EnsurePopulated从类中添加对方法的调用来完成此操作:Startup

public void Configure(IApplicationBuilder app, IWebHostEnvironment env){...app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});SeedData.EnsurePopulated(app);}

显示书籍列表

准备控制器

通过将默认内容替换为以下代码,在BooksStore/Controllers文件夹中的HomeController.cs 文件中准备控制器:

using Microsoft.AspNetCore.Mvc;
using BooksStore.Models;namespace BooksStore.Controllers
{public class HomeController : Controller{private IBooksStoreRepository repository;public HomeController(IBooksStoreRepository repo){repository = repo;}public IActionResult Index() => View(repository.Books);}
}

这称为依赖注入,其方法允许HomeController对象通过IStoreRepository接口访问应用程序的存储库,而无需知道配置了哪个实现类。

更新视图

使用以下标记更新SportsStore/Views/Home文件夹中的Index.cshtml文件的内容:

@model IQueryable<Book>@foreach (var p in Model)
{<div><h3>@p.Title</h3>@p.Description@p.Genre<h4>@p.Price.ToString("c")</h4></div>
}

运行应用程序

兴趣点

从上图中可以看到,Index.cshtml视图将数据库中的书籍显示在一个页面上。在下一篇文章中,我将添加对分页的支持,以便视图在一个页面上显示较少数量的产品,并且用户可以从一个页面移动到另一个页面以查看整体目录。

https://www.codeproject.com/Articles/5327033/An-Introduction-to-ASP-NET-Core-MVC-through-an-Exa

通过示例介绍ASP.NET Core MVC(第1部分)相关推荐

  1. 【18】ASP.NET Core MVC 中的 Model介绍

    ASP.NET Core MVC 中的 Model 在本视频中,我们将通过一个示例讨论 ASP.NET Core MVC 中的 Model. 我们希望最终从 Student 数据库表中查询特定的学生详 ...

  2. ASP.NET Core MVC – Caching Tag Helpers

    ASP.NET Core Tag Helpers系列目录,这是第二篇,共五篇: ASP.NET Core MVC – Tag Helpers 介绍 ASP.NET Core MVC – Caching ...

  3. ASP.NET Core MVC I\/O编程模型

    1.1. I/O编程模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-bloc ...

  4. ASP.NET Core MVC – Tag Helper 组件

    ASP.NET Core Tag Helpers系列目录,这是第五篇,共五篇: ASP.NET Core MVC – Tag Helpers 介绍 ASP.NET Core MVC – Caching ...

  5. ASP.NET Core MVC – 自定义 Tag Helpers

    介绍 在之前的内容中,我们谈到了Tag Helpers,我们还谈到了 caching Tag Helpers和form Tag Helpers. 通过创建自定义Tag Helpers,我们可以扩展现有 ...

  6. 这本694页的程序员砖头书让你精通ASP.NET Core MVC

    ASP.NET Core MVC是一个来自微软的Web应用程序开发框架,它结合了模型-视图-控制器(MVC)体系结构的有效性和整洁性.敏捷开发的想法和技术,以及.NET平台的最佳部分. 1.1 ASP ...

  7. asp.net core mvc权限控制:分配权限

    1,分配权限到角色:Microsoft.AspNetCore.Identity.EntityFrameworkCore中提供了RoleManager类,类中提供了把权限分配到角色的方法: Task&l ...

  8. ASP.NET Core MVC – Form Tag Helpers

    简介 我们已经介绍过Tag Helpers以及一些最常用的Tag Helpers,也谈到了缓存Tag Helpers.在这篇文章中,我们将讨论表单Tag Helpers. HTML或Web表单通过使用 ...

  9. asp.net core mvc 管道之中间件

    asp.net core mvc 管道之中间件 http请求处理管道通过注册中间件来实现各种功能,松耦合并且很灵活 此文简单介绍asp.net core mvc中间件的注册以及运行过程 通过理解中间件 ...

最新文章

  1. CUDA上深度学习模型量化的自动化优化
  2. DB-Engines:2017 年 2 月份全球数据库排名
  3. Java--图片浏览器
  4. 关于《设计模式》这本书(三)——Proxy模式
  5. 【转载】深度学习数学基础(二)~随机梯度下降(Stochastic Gradient Descent, SGD)
  6. MooTools Class 使用、继承详解
  7. 又见国产化高性能芯片——“魂芯一号”
  8. date -d的灵活应用
  9. Tkinter Helloword !
  10. Warning:关于_CRT_SECURE_NO_WARNINGS
  11. 在家办公的我,砍需求砍得更狠了
  12. ubuntu18.04安装python3.8
  13. selenium模拟登录豆瓣和qq空间
  14. swt 键盘事件ctrl+c_VB键盘事件详解
  15. 老生常谈的一个问题,转行学习编程,是自学还是报班
  16. 点餐小程序源码_微信小程序餐饮点餐商城前端模版
  17. excel转word后表格超出页面_妙招!Word和Execl“联姻”实现数据高效处理!
  18. 中国这10家慕课网站,您需要知道!
  19. MIPI CSI-2笔记(10) -- Low Level Protocol(延迟降低、传输效率增强特性LRTE)
  20. 拼多多月卡怎么退?拼多多0元试用是真是假?

热门文章

  1. 微信公众号开发时返回中文数据为问号解决方法
  2. 第二十一课LNMP环境配置中
  3. OpenMV激光打靶
  4. Arduino 流水灯 从右往左亮起来,再从左往右亮起来
  5. 创建Blend动画中 Additive Settings的作用
  6. phonopy-DFPT计算声子谱报错 LINEAR_RESPONSE_DIIS matrix is zero
  7. vue 引入js文件
  8. 什么样的云服务器更受中小型企业的青睐?
  9. 7. Excel 数据表格格式整理案例
  10. 思修复习知识点背诵-《思想道德基础与法律修养》