《 Pro ASP.NET Core 6 》--- 读书随记(1)
2022/7/3 14:19:42
本文主要是介绍《 Pro ASP.NET Core 6 》--- 读书随记(1),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Part 1
CHAPTER 1
内容来自书籍:
Pro ASP.NET Core 6
Develop Cloud-Ready Web Applications Using MVC, Blazor, and Razor Pages (Ninth Edition)Author: Adam Freeman
需要该电子书的小伙伴,可以留下邮箱,有空看到就会发送的
Putting ASP.NET Core in Context
ASP.NET Core 的结构
Understanding the Application Frameworks
当您开始使用 ASP.NET Core 时,发现有不同的应用程序框架可用会令人困惑。正如您将了解到的,这些框架是互补的,可以解决不同的问题,或者,对于某些特性,可以用不同的方式解决相同的问题。理解这些框架之间的关系意味着理解 Microsoft 所支持的不断变化的设计模式,正如我在接下来的小节中所解释的那样。
Understanding the MVC Framework
MVC 代表模型-视图-控制器,它是一种描述应用程序形状的设计模式。MVC 模式强调关注点分离,功能区域是独立定义的,这是对 Web 页面导致的模糊架构的有效解毒剂。MVC 框架的早期版本是建立在最初为 Web 页面设计的 ASP.NET 基础之上的,这导致了一些尴尬的特性和变通方法。随着移动到。NET 核心,ASP.NET 成为 ASP.NET 核心,MVC 框架是在开放、可扩展和跨平台的基础上重建的。
MVC 框架仍然是 ASP.NET 核心的重要组成部分,但是随着单页应用程序(SPA)的兴起,它的使用方式已经发生了变化。在 SPA 中,浏览器发出一个 HTTP 请求并接收一个 HTML 文档,该文档传递一个富客户端,通常使用 JavaScript 客户端(如 Angular 或 React)编写。向 SPA 的转变意味着 MVC 框架最初的意图是干净的分离不再那么重要,并且强调遵循 MVC 模式不再是必要的,即使 MVC 框架仍然有用(并且用于通过 Web 服务支持 SPA)
Understanding Razor Pages
MVC 框架的一个缺点是,在应用程序开始生成内容之前,它可能需要大量的准备工作。尽管存在结构上的问题,Web Pages 的一个优点是可以在几个小时内创建简单的应用程序。
Razor Pages 采用 Web Pages 的开发理念,并使用最初为 MVC 框架开发的平台特性来实现它。代码和内容混合在一起形成自包含的页面; 这重新创建了 Web 页面开发的速度,而没有一些基本的技术问题(尽管扩展复杂项目的问题仍然是一个问题)。
Razor Pages 可以与 MVC 框架一起使用,这是我倾向于使用它们的方式。我使用 MVC 框架编写应用程序的主要部分,并使用 Razor Pages 作为辅助功能,比如管理和报告工具。
Understanding Blazor
JavaScript 客户端框架的兴起可能成为 C # 开发人员的一个障碍,他们必须学习一种不同的、有些特殊的编程语言。我开始喜欢 JavaScript,它像 C # 一样流畅和富有表现力。但是熟练掌握一门新的编程语言需要时间和精力,尤其是一门与 C # 有根本区别的语言。
Blazor 试图通过允许 C # 用于编写客户端应用程序来弥补这一差距。Blazor 有两个版本: BlazorServer 和 BlazorWebAssembly。Blazor Server 是 ASP.NET Core 的一个稳定且受支持的部分,它通过使用到 ASP.NET Core 服务器的持久 HTTP 连接来工作,应用程序的 C # 代码就是在这个服务器上执行的。Blazor WebAssembly 是一个实验版本,它更进一步,在浏览器中执行应用程序的 C # 代码。正如我在第33章中解释的那样,Blazor 的两个版本都不适合所有情况,但它们都为 ASP.NET 核心开发的未来指明了方向。
Understanding the Utility Frameworks
两个框架与 ASP.NET Core 紧密相关,但不直接用于生成 HTML 内容或数据。实体框架核心是微软的对象关系映射(ORM)框架,它将存储在关系数据库中的数据表示为 .NET 对象。实体框架核心可用于任何 .NET 应用程序,它通常用于访问 ASP.NET 核心应用程序中的数据库。
ASP.NET Core Identity 是微软的身份验证和授权框架,用于验证 ASP.NET Core 应用程序中的用户凭据,并限制对应用程序特性的访问。
Understanding the ASP.NET Core Platform
ASP.NET Core 平台包含接收和处理 HTTP 请求以及创建响应所需的底层特性。有一个集成的 HTTP 服务器、一个用于处理请求的中间件组件系统以及应用程序框架所依赖的核心特性,例如 URL 路由和 Razor 视图引擎。
您的大部分开发时间将花在应用程序框架上,但是有效地使用 ASP.NET Core 需要了解平台提供的强大功能,没有这些功能,高级框架就无法运行
CHAPTER 2
Getting Started
Creating an ASP.NET Core Project
dotnet new globaljson --sdk-version 6.0.100 --output FirstProject dotnet new mvc --no-https --output FirstProject --framework net6.0 dotnet new sln -o FirstProject dotnet sln FirstProject add FirstProject
第一个命令创建一个名为 FirstProject 的文件夹,并在其中添加一个名为 global.json 的文件,该文件指定项目将使用的 .NET 版本; 这可以确保您在下面的示例中获得预期的结果。第二个命令创建一个新的 ASP.NET Core 项目。.NET SDK 包含一系列用于启动新项目的模板,mvc 模板是 ASP.NET Core 应用程序可用的选项之一。这个项目模板创建一个为 MVC 框架配置的项目,MVC 框架是 ASP.NET Core 支持的应用程序类型之一。其余命令创建一个解决方案文件,该文件允许将多个项目一起使用。
这是我使用包含占位符内容的项目模板的少数章节之一。我不喜欢使用预定义的项目模板,因为它们鼓励开发人员将身份验证等重要特性视为黑盒。我在这本书中的目标是给你理解和管理你的 ASP.NET Core 应用程序的每一个方面的知识,这就是为什么我从一个空的 ASP.NET Core 项目开始。本章是关于快速入门的,mvc 模板非常适合这一点。
Running the ASP.NET Core Application
Understanding Endpoints
在 ASP.NET Core 应用程序中,传入请求由端点处理。产生响应的端点是一个动作,这是一个用 C # 编写的方法。操作是在控制器中定义的,控制器是从 Microsoft.AspNetCore.Mvc.Controller class 派生的 C # 类 ,内置的控制器基类。控制器定义的每个公共方法都是一个操作,这意味着您可以调用操作方法来处理 HTTP 请求。ASP.NET Core 项目中的约定是将控制器类放在名为 Controllers 的文件夹中,该文件夹由用于设置项目的模板创建。项目模板向 Controller 文件夹添加了一个控制器,以帮助快速启动开发。控制器是在名为 homecontroller.cs 的类文件中定义的。控制器类包含一个名称后跟一个单词Controller,这意味着当你看到一个名为 homecontroller.cs 的文件时,你知道它包含一个名为 Home 的控制器,这是 ASP.NET Core 应用程序中使用的默认控制器。
Understanding Routes
ASP.NET Core 路由系统负责选择处理 HTTP 请求的端点。路由是用于决定如何处理请求的规则。创建项目时,将创建一个默认规则以启动项目。您可以请求以下任何 URL,它们将被分派到 Home 控制器定义的 Index 操作
/
, /Home
, /Home/Index
Understanding HTML Rendering
Creating and Rendering a View
前一个示例的输出不是 HTML ーー只是字符串 HelloWorld。为了生成对浏览器请求的 HTML 响应,我需要一个视图,它告诉 ASP.NET Core 如何将 Index 方法生成的结果处理成可以发送到浏览器的 HTML 响应。
可以修改action
public ViewResult Index() { return View("MyView"); }
然后这个返回的视图带着名称,指定了返回哪一个视图,所以还需要创建一个视图,名字和这个一样
@{ Layout = null; } <!DOCTYPE html> <html> <head> <title>Index</title> </head> <body> <div> Hello World (from the view) </div> </body> </html>
当我第一次编辑 Index 操作方法时,它返回一个字符串值。这意味着 ASP.NET Core 除了将字符串值传递给浏览器之外什么也不做。现在 Index 方法返回 ViewResult,Razor 用于处理视图并呈现 HTML 响应。Razor 之所以能够定位视图,是因为我遵循了标准的变量命名原则,即将视图文件放入一个文件夹,该文件夹的名称与包含 action 方法的控制器相匹配。在这种情况下,这意味着将视图文件放在 Views/Home 文件夹中,因为操作方法是由 Home 控制器定义的。除了字符串和 ViewResult 对象之外,还可以从 action 方法返回其他结果。例如,如果返回 RedirectResult,浏览器将被重定向到另一个 URL。如果返回 HttpUnauthorizedResult,则可以提示用户登录。这些对象统称为动作结果。操作结果系统允许您封装和重用操作中的常见响应。
Adding Dynamic Output
Web 应用程序的关键是构造和显示动态输出。Action 方法的任务是构造数据并将其传递给视图,以便可以使用它根据数据值创建 HTML 内容。操作方法通过向 View 方法传递参数向视图提供数据
public ViewResult Index() { int hour = DateTime.Now.Hour; string viewModel = hour < 12 ? "Good Morning" : "Good Afternoon"; return View("MyView", viewModel); }
相应的,视图也要修改,拿出数据
@model string // 绑定action中传递进来的数据 @{ Layout = null; } <!DOCTYPE html> <html> <head> <title>Index</title> </head> <body> <div> @Model World (from the view) </div> </body> </html>
Putting the Pieces Together
这是一个简单的结果,但是这个示例揭示了创建一个简单的 ASP.NET Core Web 应用程序和生成动态响应所需的所有构建块。ASP.NET Core 平台接收 HTTP 请求并使用路由系统将请求 URL 与端点匹配。在本例中,端点是 Home 控制器定义的 Index 操作方法。该方法被调用并生成一个 ViewResult 对象,其中包含一个视图和一个视图模型对象的名称。Razor 视图引擎定位并处理视图,计算@Model 表达式以将 action 方法提供的数据插入到响应中,响应返回给浏览器并显示给用户。当然,还有许多其他可用的特性,但这是 ASP.NET Core 的本质,值得在阅读本书其余部分时牢记这个简单的顺序。
CHAPTER 3
Your First ASP.NET Core Application
Adding a Data Model
数据模型是任何 ASP.NET 核心应用程序中最重要的部分。模型是真实世界对象、过程和规则的表示,这些对象、过程和规则定义应用程序的主题(称为域)。该模型通常被称为域模型,包含构成应用程序全局的 C # 对象(称为域对象)和操作它们的方法。在大多数项目中,ASP.NET Core 应用程序的工作是向用户提供对数据模型的访问以及允许用户与其交互的特性。
ASP.NET Core 应用程序的约定是数据模型类是在一个文件夹中定义的名为 Models
public class GuestResponse { public string? Name { get; set; } public string? Email { get; set; } public string? Phone { get; set; } public bool? WillAttend { get; set; } }
Creating a Second Action and View
我的应用程序目标之一是包含一个 RSVP 表单,这意味着我需要定义一个可以接收该表单请求的操作方法。一个控制器类可以定义多个操作方法,约定是在同一个控制器中对相关操作进行分组
public ViewResult RsvpForm() { return View(); }
在Views/Home
目录下创建一个与action方法名称一致的视图
@{ Layout = null; } <!DOCTYPE html> <html> <head> <title>RsvpForm</title> </head> <body> <div> This is the RsvpForm.cshtml View </div> </body> </html>
Linking Action Methods
我希望能够从 Index 视图创建一个链接,这样客户就可以看到 RsvpForm 视图,而不必知道针对特定操作方法的 URL
@{ Layout = null; } <!DOCTYPE html> <html> <head> <title>Index</title> </head> <body> <div> <a asp-action="RsvpForm">RSVP Now</a> </div> </body> </html>
添加到清单中的是一个具有 asp action 属性的元素。该属性是tag helper属性的一个示例,这是在呈现视图时执行的 Razor 指令。Asp-action 属性是将 href 属性添加到包含 action 方法 URL 的元素的指令。
这里有一个重要的工作原则,那就是您应该使用 ASP.NET Core 提供的特性来生成 URL,而不是将它们硬编码到您的视图中。当tag helper为元素创建 href 属性时,它检查应用程序的配置,以确定 URL 应该是什么。这允许更改应用程序的配置,以支持不同的 URL 格式,而无需更新任何视图。
Building the Form
接下来我将构建 RsvpForm.cshtml 文件的内容,以便将其转换为用于编辑 GuestResponse 对象的 HTML 表单
@model GuestResponse @{ Layout = null; } <!DOCTYPE html> <html> <head> <title>RsvpForm</title> </head> <body> <form asp-action="RsvpForm" method="post"> <div> <label asp-for="Name">Your Name: </label> <input asp-for="Name"/> </div> <div> <label asp-for="Email">Your Email: </label> <input asp-for="Email"/> </div> <div> <label asp-for="Phone">Your Phone: </label> <input asp-for="Phone"/> </div> <div> <label asp-for="WillAttend">Will you attend?</label> <select asp-for="WillAttend"> <option value="">Choose an option</option> <option value="true">Yes, I'll be there</option> <option value="false">No, I can't come</option> </select> </div> <button type="submit">Submit RSVP</button> </form> </body> </html>
@model 表达式指定视图期望接收 GuestResponse 对象作为其视图模型。
每个元素都使用 asp-for 属性与 model 属性相关联,asp-for 属性是另一个 Tag Helper 属性。Tag Helper 属性配置元素以将它们绑定到视图模型对象
Receiving Form Data
我还没有告诉 ASP.NET Core 当表单发送到服务器时我想做什么。就目前情况而言,单击 Submit RSVP 按钮只会清除在表单中输入的任何值。这是因为表单回发到 Home 控制器中的 RsvpForm 操作方法,该方法只是再次呈现视图。为了接收和处理提交的表单数据,我将使用控制器的一个重要特性。我将添加第二个 RsvpForm 操作方法来创建以下内容
- 响应 HTTP GET 请求的方法: GET 请求是浏览器通常在每次有人单击链接时发出的请求。这个版本的操作将负责在有人首次访问/Home/RsvpForm 时显示初始空白表单。
- 响应 HTTP POST 请求的方法: form 元素将 method 属性设置为 POST,这将导致表单数据作为 POST 请求发送到服务器。这个版本的操作将负责接收提交的数据并决定如何处理它。
在单独的 C # 方法中处理 GET 和 POST 请求有助于保持控制器代码的整洁,因为这两个方法有不同的职责。这两个操作方法都由相同的 URL 调用,但 ASP.NET Core 确保根据处理的是 GET 还是 POST 请求调用适当的方法。
[HttpPost] public ViewResult RsvpForm(GuestResponse guestResponse) { // TODO: store response from guest return View(); }
Understanding Model Binding
答案是模型绑定,这是一个有用的 ASP.NET Core 特性,可以解析传入的数据,并使用 HTTP 请求中的键-值对来填充域模型类型的属性
模型绑定是一个功能强大且可定制的特性,它消除了直接处理 HTTP 请求的麻烦,让您可以处理 C # 对象,而不必处理浏览器发送的单个数据值。作为 action 方法的参数传递的 GuestResponse 对象会自动填充来自表单字段的数据。
Adding Validation
现在可以向应用程序添加数据验证。如果没有验证,用户可以输入无意义的数据,甚至提交一个空表单。在 ASP.NET Core 应用程序中,验证规则是通过将属性应用于模型类来定义的,这意味着同样的验证规则可以应用于使用该类的任何形式。ASP 依赖于 System.ComponentModel.DataAnnotations 名称空间
public class GuestResponse { [Required(ErrorMessage = "Please enter your name")] public string? Name { get; set; } [Required(ErrorMessage = "Please enter your email address")] [EmailAddress] public string? Email { get; set; } [Required(ErrorMessage = "Please enter your phone number")] public string? Phone { get; set; } [Required(ErrorMessage = "Please specify whether you'll attend")] public bool? WillAttend { get; set; } }
ASP.NET Core 检测这些属性,并在模型绑定过程中使用它们来验证数据。
如前所述,我使用可空类型来定义 GuestResponse 属性。这对于表示可能没有赋值的属性很有用,但是它对 WillAttender 属性有一个特殊的值,因为它允许“必需”验证属性工作。如果我使用了一个常规的不可为空的 bool,那么我通过模型绑定得到的值只能是 true 或 false,而且我无法判断用户是否选择了一个值。可为空的 bool 有三个可能的值: true、 false 和 null。如果用户还没有选择一个值,WillAttend 属性的值将为空,这将导致“必需”属性报告验证错误。这是 ASP.NET Core 如何优雅地将 C # 特性与 HTML 和 HTTP 混合在一起的一个很好的例子。
我使用接收表单数据的 action 方法中的 ModelState.IsValid 属性检查是否存在验证问题
[HttpPost] public ViewResult RsvpForm(GuestResponse guestResponse) { if (ModelState.IsValid) { // TODO: store response from guest return View("Thanks", guestResponse); } else { return View(); } }
当它呈现一个视图时,Razor 可以访问与请求相关的任何验证错误的详细信息,标记助手可以访问这些详细信息以向用户显示验证错误。
<form asp-action="RsvpForm" method="post"> <div asp-validation-summary="All"></div> <div> <label asp-for="Name">Your Name: </label> <input asp-for="Name"/> </div> <div> <label asp-for="Email">Your Email: </label> <input asp-for="Email"/> </div> <div> <label asp-for="Phone">Your Phone: </label> <input asp-for="Phone"/> </div> <div> <label asp-for="WillAttend">Will you attend?</label> <select asp-for="WillAttend"> <option value="">Choose an option</option> <option value="true">Yes, I'll be there</option> <option value="false">No, I can't come</option> </select> </div> <button type="submit">Submit RSVP</button> </form>
asp-validation-summary 属性应用于 div 元素,并在呈现视图时显示验证错误列表。asp-validation-summary 属性的值来自名为 ValidationSummary 的枚举,该枚举指定摘要将包含哪些类型的验证错误。
在应用于 GuestResponse 类的所有验证约束都得到满足之前,RsvpForm 操作方法将不会呈现“感谢”视图。注意,当 Razor 使用 asp-validation-summary 呈现视图时,在 Name 字段中输入的数据被保留并再次显示。这是模型绑定的另一个好处,它简化了处理表单数据的工作。
CHAPTER 4
Using the Development Tools
Creating a Project Using the Command Line
列出所有可用的模板
dotnet new --list
文件指定.net版本
dotnet new globaljson --sdk-version 6.0.100 --output MySolution/MyProject
根据模板创建项目
dotnet new web --no-https --output MySolution/MyProject --framework net6.0
创建解决方案
dotnet new sln -o MySolution
添加项目到解决方案
dotnet sln MySolution add MySolution/MyProject
Building and Running Projects
构建项目
dotnet build
构建并运行项目
dotnet run
Using the Hot Reload Feature
使用热重启功能,并运行项目
dotnet watch
Managing NuGet Packages
添加依赖到项目
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 6.0.0
查看项目依赖的库
dotnet list package
删除依赖
dotnet remove package Microsoft.EntityFrameworkCore.SqlServer
Managing Tool Packages
安装数据库ef工具
dotnet tool install --global dotnet-ef --version 6.0.0
卸载工具
dotnet tool uninstall --global dotnet-ef
Managing Client-Side Packages
安装客户端相关的工具 LibMan,用于安装前端资源到项目
dotnet tool install --global Microsoft.Web.LibraryManager.Cli --version 2.1.113
卸载工具
dotnet tool uninstall --global Microsoft.Web.LibraryManager.Cli
初始化libman,创建一个文件,用于记录项目安装的前端依赖;-p
参数是用于指定包下载的仓库地址
libman init -p cdnjs
安装 Bootstrap CSS框架
libman install bootstrap@5.1.3 -d wwwroot/lib/bootstrap
这篇关于《 Pro ASP.NET Core 6 》--- 读书随记(1)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#