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

目录

介绍

背景

使用代码

创建项目

更改Razor视图

添加数据模型

向应用程序添加数据

安装实体框架核心包

定义连接字符串

创建数据库上下文类

配置实体框架核心

创建存储库

创建数据库迁移

创建种子数据

显示书籍列表

准备控制器

更新视图

运行应用程序

兴趣点


介绍

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

在这些文章中,通过一个名为BooksStore的项目,我想向您展示一个从开始到部署的真实开发过程。我使用了Windows 10Visual Studio 2019SQL 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"
  }
}

此配置字符串指定一个名为BooksStoreLocalDB数据库并启用多活动结果集功能(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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Pro ASP.NET Core MVC 2(第7版)中文版》是一本介绍ASP.NET Core MVC 2的权威指南。本书主要针对ASP.NET Core MVC 2的开发者和学习者,提供了全面且深入的内容。 这本书的主要特点包括以下几个方面: 1. 详尽的介绍:本书涵盖了ASP.NET Core MVC 2的所有关键概念和特性,包括路由、模型绑定、控制器、视图、中间件等。读者可以通过本书全面了解ASP.NET Core MVC 2的工作原理和使用方法。 2. 实战案例:除了理论知识,本书还提供了大量的实际案例,帮助读者将所学知识应用于实际开发中。这些案例覆盖了各种常见的应用场景,如用户认证、数据验证、日志记录等,读者可以通过阅读这些案例来掌握如何开发高质量的ASP.NET Core MVC 2应用程序。 3. 最佳实践和高级主题:本书还介绍了许多ASP.NET Core MVC 2的最佳实践和高级主题,包括性能优化、安全性、单元测试等。通过学习这些内容,读者可以进一步提升自己的开发技能,写出更加高效、安全的应用程序。 4. 附带示例代码和练习:为了帮助读者更好地理解书中的概念和技术,本书附带了大量的示例代码和练习。读者可以自己动手实践这些示例和练习,巩固所学知识。 总的来说,《Pro ASP.NET Core MVC 2(第7版)中文版》是一本非常权威且实用的ASP.NET Core MVC 2指南。无论是初学者还是有经验的开发者,都可以通过阅读本书,提升自己在ASP.NET Core MVC 2开发领域的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值