大家好,关于mvc40网站源码分享很多朋友都还不太明白,今天小编就来为大家分享关于web源码网站的知识,希望对各位有所帮助!
ASP.NETCoreMVC是一个来自微软的Web应用程序开发框架,它结合了模型-视图-控制器(MVC)体系结构的有效性和整洁性、敏捷开发的想法和技术,以及.NET平台的最佳部分。
1.1ASP.NETCoreMVC的历史
最早的ASP.NET是在2002年推出的,当时微软热衷于保护其在传统桌面应用程序开发中的主导地位,并将互联网视为威胁。图1-1说明了当时出现的ASP.NETWebForms技术栈。
图1-1ASP.NETWebForms技术栈
1.1.1ASP.NETWebForms
微软试图使用ASP.NETWebForms将用户界面(UserInterface,UI)模拟为服务器端控件对象层,隐藏超文本传输协议HTTP(本身是无状态的)和超文本标记语言HTML(当时许多开发人员对此还不熟悉)。每个控件在请求之间保持自己的状态,在需要时自动渲染为HTML,并将客户端事件(如按钮单击)与服务器端相应的事件处理程序代码相关联。实际上,Web窗体是一个巨大的抽象层,旨在通过Web传递经典的事件驱动的图形用户界面(GraphicsUserInterface,GUI)。
其思想是使Web开发的体验与开发桌面应用程序一致。开发人员可以基于有状态的用户界面进行考虑,而无须使用一系列独立的HTTP请求和响应。微软可以使Windows桌面开发人员向新型Web应用程序开发领域实现无缝转型。
ASP.NETWebForms存在的问题
传统的ASP.NETWebForms开发从原则上来说曾经很好,但事实证明它更加复杂。
ViewState权重:跨请求维护状态的实际机制(称为“ViewState”)导致在客户端和服务器之间传输大量数据。即使是大小适中的Web应用程序,这些数据也可能会达到几百千字节,并且每次请求都会来回传递数据,从而导致响应时间更慢,并增加了服务器的带宽需求。页面生命周期:连接客户端事件与服务器端事件处理程序代码(页面生命周期的一部分)的机制可能会变得复杂和棘手。很少有开发人员在不产生ViewState错误或发现某些事件处理程序莫名失败的情况下,能在运行时成功操纵控件层。关注点分离的错误理念:ASP.NETWebForms的代码隐藏模型提供了将应用程序代码从HTML标记中移除到单独的代码隐藏类中的方法。这是为了分离逻辑层和表现层,但实际上,又鼓励开发人员将表现层代码(如操纵服务器端控件树)与其应用程序逻辑(如操纵数据库数据)混在这些怪异的后台代码类中。最终的结果可能是难以理解的。对HTML的有限控制:服务器控件将其自身呈现为HTML,但不一定是你想要的HTML。在ASP.NET的早期版本中,HTML输出无法符合Web标准,或者不能很好地利用层叠样式表(CSS),并且服务器控件生成难以预测且复杂的ID属性,这些属性难以使用JavaScript访问。这些问题在最近的ASP.NETWebForms版本中有所改进,但是获取你期望的HTML仍然是比较困难的。有漏洞的抽象:ASP.NETWebForms尽可能隐藏HTML和HTTP。当你尝试实现自定义行为时,你经常会放弃抽象,这迫使你对回发事件机制进行逆向工程,或执行笨拙的操作以使其生成所需的HTML。低可测试性:ASP.NETWebForms的设计人员无法预料到自动测试将成为软件开发的重要组成部分。他们设计的紧密耦合架构不适合单元测试。集成测试也可能是一个挑战。
ASP.NETWebForms并非一无是处,实际上,微软为提高标准合规性和简化开发流程付出了巨大的努力,甚至从原始的ASP.NETMVC框架中获取了一些功能,并将其应用于ASP.NETWebForms。当你需要快速的结果时,ASP.NETWebForms表现优异,你可以在一天内拥有一个相当复杂的Web应用程序。但除非你在开发过程中足够小心,否则你会发现你创建的应用程序难以测试和维护。
1.1.2起初的MVC框架
2007年10月,微软发布了一个基于现有ASP.NET平台的新开发平台,旨在直接回应对ASP.NETWebForms的批评和竞争平台(如RubyonRails)的普及。新平台称为ASP.NETMVC框架,并反映了Web应用程序开发的新兴趋势,如HTML和CSS标准化、RESTWeb服务、有效的单元测试以及开发人员应该接受HTTP的无状态特性的想法。
支持最初MVC框架的概念现在看起来很自然而且显而易见,但是它们在2007年的.NETWeb开发世界中是缺乏的。ASP.NETMVC框架的引入使微软的Web开发平台重新回到了现代。
MVC框架还表明微软的态度发生了重大变化,微软以前曾试图控制Web应用程序工具链中的每个组件。现在微软基于jQuery等开源工具构建了MVC框架,从竞争(并且更为成功的)平台中获得了设计约定和最佳实践,并将源代码发布到MVC框架,供开发人员审查。
起初的MVC框架存在的问题
微软在创建MVC框架时,基于现有的ASP.NET平台,这是有道理的,因为该平台具有很多固有的底层特性,ASP.NET开发人员都熟知和理解这些特性。
但是,将MVC框架移植到最初为ASP.NETWebForms设计的平台上是需要妥协的。MVC框架开发人员逐渐喜欢使用配置设置和代码调整,来禁用或重新配置对Web应用程序没有任何影响但对整个程序正常工作来说必需的特性。
随着MVC框架的普及,微软开始将一些核心功能添加到ASP.NETWebForms中。结果越来越不相匹配,其中需要用来支持MVC框架的独特设计特性被扩展到支持ASP.NETWebForms,却为了让所有的东西融合在一起而让设计变得更加不相匹配。同时,微软开始使用创建Web服务(WebAPI)和实时通信(SignalR)的新框架来扩展ASP.NET。新的框架添加了自己的配置和开发约定,每个都有自己的优点和特异之处,结果导致了零乱的混乱状态。
1.2ASP.NETCore
2015年,微软公布了ASP.NET和MVC框架的新方向,也就是本书要讨论的主题ASP.NETCoreMVC。
ASP.NETCore基于.NETCore构建,它是.NETFramework的跨平台版本,没有Windows平台特定的应用程序编程接口(ApplicationProgrammingInterface,API)。虽然Windows仍然是主要的操作系统,但Web应用程序越来越多地托管在云平台的小型而简单的容器中,并且通过采用跨平台方法,微软扩展了.NET的覆盖面,使得ASP.NETCore应用程序能够部署到更广泛的托管环境中。另外,ASP.NETCore还有一个额外的优点——开发人员可以在Linux系统和macOS上创建ASP.NETCoreWeb应用程序。
ASP.NETCore是一个全新的框架。它更简单、更容易处理,并且没有来自ASP.NETWebForms的遗留问题。另外,由于它基于.NETCore,因此它支持在一系列平台和容器上进行Web应用程序开发。
ASP.NETCoreMVC提供了基于新的ASP.NETCore平台构建的初始ASP.NETMVC框架的功能。它集成了以前由WebAPI提供的功能,能以更自然的方式生成复杂内容,并且使关键开发任务(如单元测试)更简单。
1.2.1ASP.NETCoreMVC2的新特性
ASP.NETCoreMVC2的发布版本重点关注整合,它在早期版本中引入了一些工具和平台变更。ASP.NETCoreMVC2需要.NETCore2,它具有很多扩展的API,现已在其他Linux发行版上受到支持。有用的变化包括一个新的元数据包系统(它简化了NuGet包的管理),一个新的ASP.NETCore配置系统,以及对EntityFrameworkCore2的支持。最重要的新功能是RazorPages,它尝试重新构建应用,并使用更现代的平台创建与WebPages相关的开发风格,但MVC开发人员对RazorPages并不感兴趣(因而在本书中没有描述)。
1.2.2ASP.NETCoreMVC的主要优点
本节将简要介绍新的MVC平台如何克服ASP.NETWebForms和初始MVC框架的遗留问题,以及如何完善ASP.NET。
1.MVC架构
ASP.NETCoreMVC遵循称为模型-视图-控制器(MVC)的模式,指导ASP.NETWeb应用程序及其包含的组件之间的交互。
区分MVC架构模式和ASP.NETCoreMVC实现很重要。MVC模式并不新颖,它可以追溯到1978年XeroxPARC的Smalltalk项目,但是它作为Web应用程序的一种开发模式,已经得到了广泛普及,原因如下。
用户与遵守MVC模式的应用程序进行交互是遵循自然循环的。用户执行一个动作,应用程序进行响应,更改其数据模型并向用户传递更新的视图。然后重复这一循环。这对作为一系列HTTP请求和响应来传输的Web应用程序来说非常合适。Web应用程序需要组合几种技术(例如数据库、HTML和可执行代码等),通常分为一系列层次。这些组合产生的模式会自然地映射到MVC模式的概念上。
ASP.NETCoreMVC实现了MVC模式,与ASP.NETWebForms相比,ASP.NETCoreMVC极大改善了关注点的分离。实际上,ASP.NETCoreMVC实现了MVC模式的变体,特别适用于Web应用程序。你将在第3章中更多地了解此架构的理论和实践。
2.可扩展性
ASP.NETCore和ASP.NETCoreMVC已构建为一系列具有明确特征的独立组件,能满足.NET接口的需求,也可构建在抽象基类上。你可以轻松地用自己的实现替换关键组件。一般来说,ASP.NETCoreMVC为每个组件提供了以下3个选项。
使用组件的默认实现(对于大多数应用程序来说应该是足够的)。从默认实现派生一个子类来调整其行为。使用接口或抽象基类的新实现完全替换组件。
你将从第14章开始,了解各种组件、如何替换以及为什么要调整或替换每个组件。
3.严格控制HTML和HTTP
ASP.NETCoreMVC能够生成清晰、符合标准的标签。它的内置标签帮助器能产生符合标准的输出,但与ASP.NETWebForms相比,有更重要的理念上的变化。ASP.NETCoreMVC并不会生成一些难以控制的HTML控件,而是鼓励你创建简单而优雅的标签,并使用CSS进行样式化。
当然,如果你想要为诸如日期选择器或级联菜单之类的复杂UI元素使用一些现成的小部件,那么ASP.NETCoreMVC采用的“无特定要求”方法可以很轻松地使用各种最佳组合的客户端库,如jQuery、Angular或BootstrapCSS库。ASP.NETCoreMVC与这些库相互配合得很好,微软已包含这些模板以启动新的开发项目。
ASP.NETCoreMVC与HTTP协调工作。你可以控制在浏览器和服务器之间传递的请求,因此你可以根据需要调整用户体验。使用Ajax更加容易,创建Web服务来接收浏览器HTTP请求是一个简单的过程。
4.可测试性
ASP.NETCoreMVC架构在使应用程序变得可维护和可测试方面提供了良好的开端,因为你可以将不同的应用程序关注点自然地分离成独立的部分。此外,ASP.NETCore平台和ASP.NETCoreMVC框架的每个部分都可以为单元测试进行隔离和替换,可以使用任何流行的开源测试框架(如xUnit)。
在本书中,你将看到如何为ASP.NETMVC控制器编写整洁、简单的单元测试示例。为了模拟各种场景,这些示例使用各种测试和模拟策略来支持框架组件的虚构或模拟实现。即使你以前从来没有写过单元测试,这也是一个很好的开始。
可测试性不仅仅是单元测试的问题。ASP.NETCoreMVC应用程序也可以与UI自动化测试工具一起使用。你可以编写模拟用户交互的测试脚本,而不需要猜测框架将生成哪些HTML元素结构、CSS类或ID,你不必担心页面结构发生意外的变化。
5.强大的路由系统
统一资源定位器(URL)的风格随着Web应用技术的发展而发展,比如,以下URL越来越少见。
/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742
取而代之的是一种更简单、更干净的格式:
/to-rent/chicago/2303-silver-street
采用这种URL结构有一些很好的理由。第一,搜索引擎会对URL中找到的关键字加权。搜索“rentinChicago”(芝加哥租房)更有可能找到更简单的网址。第二,许多网络用户现在已经足够了解URL,并乐于通过在浏览器的地址栏中键入导航选项。第三,当人们理解URL的结构时,才更有可能链接它,与朋友分享,甚至通过手机朗读。第四,它不会向公共Internet暴露你的应用程序的技术细节、文件夹和文件名结构,因此你可以自由地更改底层的实现,而不会破坏所有的传入链接。
整洁的URL在早期的框架中很难实现,但ASP.NETCoreMVC默认使用称为URL路由的功能来提供整洁的URL。这样可以控制你的URL模式及其与应用程序之间的关系,自由地为用户创建有意义和有用的URL模式,而无须遵守预定义模式。当然,这意味着你可以轻松地定义一种现代REST风格的URL模式。
6.现代API
微软的.NET平台随每个主版本的发展而发展,支持甚至定义了现代编程的最新方向。ASP.NETCoreMVC是为.NETCore构建的,因此其API可以充分利用C语言特性,第4章会提供MVC开发中最重要的C语言功能。
在第2章中,你将通过创建一个简单的Web应用程序,深入了解主要组件、构建块以及它们如何组合在一起。然而,本书第一部分主要介绍如何开发一个名为SportsStore的项目,通过该项目,展示从开始到部署的实际开发流程,并介绍ASP.NETCoreMVC的主要特性。
本书第二部分将解释用于构建SportsStore应用程序的ASP.NETCoreMVC功能的内部工作原理。该部分将展示每个功能如何工作,解释它所扮演的角色,并展示可用的配置和自定义选项。本书第一部分介绍广泛的背景基础,第二部分则深入讨论细节。
作者简介
AdamFreeman是一位经验丰富的IT专家,曾在一系列公司担任高级职务,最后的职务是一家全球性银行的首席技术官(ChiefTechnologyOfficer,CTO)和首席运营官(ChiefOperatingOfficer,COO)。退休以后,他喜欢写作和长跑。
详细目录
目录第一部分ASP.NETCoreMVC第1章ASP.NETCoreMVC背景21.1ASP.NETCoreMVC的历史21.1.1ASP.NETWebForms21.1.2起初的MVC框架31.2ASP.NETCore31.2.1ASP.NETCoreMVC2的新特性41.2.2ASP.NETCoreMVC的主要优点41.3预备知识61.4本书的结构61.5如何获取本书的示例代码61.6联系作者61.7小结7第2章首个MVC应用程序82.1安装VisualStudio82.2安装.NETCore2.0SDK92.3创建新的ASP.NETCoreMVC项目92.3.1添加控制器112.3.2理解路由132.4渲染页面142.4.1创建并渲染视图142.4.2添加动态输出162.5创建一个简单的数据录入程序172.5.1设置场景172.5.2设计数据模型182.5.3创建第二个操作和强类型视图182.5.4链接操作方法192.5.5建立表单202.5.6接收表单数据212.5.7显示响应252.5.8添加验证272.5.9设置内容样式312.6小结35第3章MVC模式、项目与约定363.1MVC简史363.2MVC模式363.2.1模型363.2.2控制器373.2.3视图373.2.4MVC的ASP.NET实现373.3MVC与其他模式的比较383.3.1“智能UI”模式383.3.2理解模型-视图架构393.3.3经典的3层架构393.3.4MVC的多样性403.4ASP.NETCoreMVC项目403.4.1创建项目413.4.2关于MVC的约定433.5小结44第4章C类进行更改946.3.3使用浏览器链接996.4部署JavaScript和CSS1026.4.1启用静态内容传递1026.4.2为项目添加静态内容1036.4.3更新视图1046.4.4MVC应用程序中的打包和缩小1056.5小结108第7章对MVC应用程序进行单元测试1097.1准备示例项目1097.1.1启用内置的标签助手1097.1.2为控制器添加操作方法1107.1.3创建数据输入表单1107.1.4更新Index视图1117.2测试MVC应用程序1127.2.1创建单元测试项目1127.2.2创建项目引用1137.2.3编写并运行单元测试1157.2.4隔离组件以进行单元测试1167.3改进单元测试1237.3.1参数化单元测试1237.3.2改进假的实现1267.4小结129第8章SportsStore应用程序1308.1准备开始1308.1.1创建MVC项目1308.1.2创建单元测试项目1338.1.3测试和启动应用程序1348.2开始领域模型开发1348.2.1创建存储库1358.2.2创建虚拟存储库1358.2.3注册存储库服务1368.3显示产品清单1378.3.1添加一个控制器1378.3.2添加并配置视图1388.3.3设置默认路由1398.3.4运行应用程序1408.4准备数据库1408.4.1安装EntityFrameworkCore工具包1418.4.2创建数据库类1418.4.3创建存储库类1428.4.4定义连接字符串1428.4.5配置应用程序1438.4.6创建数据库迁移1458.4.7创建种子数据1458.5添加分页1488.5.1显示页面链接1498.5.2改进URL1558.6更改内容样式1578.6.1安装Bootstrap包1578.6.2将Bootstrap样式应用于布局1578.6.3创建分部视图1598.7小结160第9章SportsStore的导航1619.1添加导航控件1619.1.1过滤产品列表1619.1.2优化URL结构1649.1.3构建类别导航菜单1679.1.4更正页数1729.2构建购物车1749.2.1定义购物车模型1749.2.2添加AddToCart按钮1779.2.3启用会话1799.2.4实现Cart控制器1809.2.5显示购物车的内容1819.3小结183第10章完成购物车18410.1使用服务优化购物车模型18410.1.1创建支持存储感知的Cart类18410.1.2注册服务18510.1.3简化Cart控制器18510.2完成购物车功能18610.2.1从购物车中删除商品18610.2.2添加购物车摘要小部件18810.3提交订单19010.3.1创建模型类19010.3.2添加结账流程19110.3.3实现订单处理19310.3.4完成Order控制器19510.3.5显示验证错误19810.3.6显示摘要页面19910.4小结199第11章SportsStore的管理20011.1管理订单20011.1.1增强模型20011.1.2添加操作方法和视图20111.2添加目录管理20311.2.1创建CRUD控制器20311.2.2实现列表视图20511.2.3编辑商品20611.2.4创建新的商品21611.2.5删除商品21711.3小结220第12章SportsStore的安全和部署22112.1保护管理功能22112.1.1创建身份标识数据库22112.1.2应用基本授权策略22412.1.3创建账户控制器和视图22612.1.4测试安全策略22912.2部署应用程序22912.2.1创建数据库23012.2.2准备应用程序23112.2.3应用数据库迁移23412.2.4管理数据库填充23412.2.5部署应用程序23712.3小结239第13章使用VisualStudioCode24013.1设置开发环境24013.1.1安装Node.js24013.1.2检查Node.js安装状态24113.1.3安装Git24113.1.4检查Git安装状态24113.1.5安装Bower24113.1.6安装.NETCore24213.1.7检查.NETCore安装状态24213.1.8安装VisualStudioCode24213.1.9检查VisualStudioCode安装状态24313.1.10安装VisualStudioCode的C#扩展24313.2创建ASP.NETCode项目24413.3使用VisualStudioCode准备项目24413.3.1管理客户端软件包24513.3.2配置应用程序24613.3.3构建和运行项目24613.4重新创建PartyInvites应用程序24613.4.1创建模型和存储库24713.4.2创建数据库24913.4.3创建控制器和视图25013.5VisualStudioCode中的单元测试25413.5.1创建单元测试25413.5.2运行测试25513.6小结255第二部分ASP.NETCoreMVC详解第14章配置应用程序25714.1准备示例项目25714.2配置项目25914.2.1将包添加到项目中25914.2.2将工具包添加到项目中26114.3理解Program类26114.4了解Startup类26414.4.1了解ASP.NET服务26614.4.2了解ASP.NET中间件26814.4.3了解如何调用Configure方法27514.4.4添加其他中间件27814.5配置应用程序28114.5.1创建JSON配置文件28314.5.2使用配置数据28414.5.3配置日志记录28514.5.4配置依赖注入28814.6配置MVC服务28914.7处理复杂配置29014.7.1创建不同的外部配置文件29014.7.2创建不同的配置方法29214.7.3创建不同的配置类29314.8小结294第15章URL路由29515.1准备示例项目29515.1.1创建模型类29615.1.2创建Example控制器29615.1.3创建视图29815.2介绍URL模式29915.3创建和注册简单路由29915.4定义默认值30015.5使用静态URL片段30315.6定义自定义片段变量30615.6.1使用自定义片段变量作为操作方法的参数30815.6.2定义可选的URL片段30915.6.3定义可变长度路由31115.7约束路由31215.7.1使用正则表达式约束路由31415.7.2使用类型和值约束31615.7.3组合约束31615.7.4定义自定义约束31815.8使用特性路由32015.8.1准备特性路由32015.8.2应用特性路由32115.8.3应用路由约束32315.9小结323第16章高级路由特性32416.1准备示例项目32416.2在视图中生成传出的URL32516.2.1创建传出的链接32616.2.2创建非链接的URL33316.3自定义路由系统33416.3.1更改路由系统配置33516.3.2创建自定义路由类33616.4使用区域34416.4.1创建区域34416.4.2创建区域路由34516.4.3填充区域34616.4.4生成区域中指向操作的链接34716.5URL模式最佳实践34816.5.1保持URL的整洁性34816.5.2GET方法和POST方法:选择最合适的方法34916.6小结349第17章控制器和操作35017.1准备示例项目35017.2理解控制器35317.3创建控制器35317.3.1创建POCO控制器35317.3.2使用控制器基类35517.4接收上下文数据35517.4.1从Context对象中接收数据35617.4.2使用操作方法参数35917.5生成响应36017.5.1使用Context对象生成响应36017.5.2理解操作结果36117.5.3生成HTML响应36217.5.4执行重定向36917.5.5返回不同类型的内容37417.5.6响应文件的内容37617.5.7返回错误和HTTP状态码37717.5.8理解其他操作结果类37817.6小结378第18章依赖注入37918.1准备示例项目37918.1.1创建模型和存储库38018.1.2创建控制器和视图38118.1.3创建单元测试项目38318.2创建松散耦合的组件38318.3ASP.NET的依赖注入38718.3.1准备依赖注入38818.3.2配置服务提供者38918.3.3对具有依赖项的控制器进行单元测试39018.3.4使用依赖关系链39018.3.5对具体类型使用依赖注入39318.4服务的生命周期39418.4.1使用瞬态生命周期39518.4.2使用作用域的生命周期39818.4.3使用单例生命周期39918.5使用操作注入40018.6使用属性注入特性40118.7手动请求实现对象40118.8小结402第19章过滤器40319.1准备示例项目40319.1.1启用SSL40419.1.2创建控制器和视图40419.2使用过滤器40519.3实现过滤器40819.4使用授权过滤器40919.5使用操作过滤器41219.5.1创建操作过滤器41219.5.2创建异步操作过滤器41419.6使用结果过滤器41419.6.1创建结果过滤器41519.6.2创建异步结果过滤器41619.6.3创建混合操作/结果过滤器41719.7使用异常过滤器41919.8为过滤器使用依赖注入42119.8.1解决过滤器依赖项42119.8.2管理过滤器的生命周期42419.9创建全局过滤器42619.10理解和更改过滤器的执行顺序42819.11小结430第20章API控制器43120.1准备示例项目43120.1.1创建模型和存储库43120.1.2创建控制器和视图43320.2REST控制器的作用43520.2.1速度问题43520.2.2效率问题43620.2.3开放性问题43620.3REST和API控制器43620.3.1创建API控制器43720.3.2测试API控制器44020.3.3在浏览器中使用API控制器44320.4内容格式44520.4.1默认内容策略44520.4.2内容协商44620.4.3指定action数据格式44820.4.4从路由或查询字符串获取数据格式44920.4.5启用完成内容协商45020.4.6接收不同的数据格式45120.5小结452第21章视图45321.1准备示例项目45321.2创建自定义视图引擎45421.2.1创建自定义IView45621.2.2创建IViewEngine实现45621.2.3注册自定义视图引擎45721.2.4测试视图引擎45821.3使用Razor引擎45921.3.1准备示例项目45921.3.2Razor视图46121.4将动态内容添加到Razor视图中46321.4.1使用布局部分46421.4.2使用分部视图46821.4.3将JSON内容添加到视图中46921.5配置Razor47121.6小结475第22章视图组件47622.1准备示例项目47622.1.1创建模型和存储库47622.1.2创建控制器和视图47822.1.3配置应用程序48022.2视图组件48122.3创建视图组件48122.3.1创建POCO视图组件48222.3.2从ViewComponent基类派生48322.3.3视图组件结果48422.3.4获取上下文数据48722.3.5创建异步视图组件49122.4创建混合的控制器/视图组件类49322.4.1创建混合视图49322.4.2应用混合类49522.5小结495第23章标签助手49623.1准备示例项目49623.1.1创建模型和存储库49623.1.2创建控制器、布局与视图49723.1.3配置应用程序49923.2创建标签助手50023.2.1定义标签助手类50123.2.2注册标签助手50323.2.3使用标签助手50323.2.4管理标签助手的作用域50523.3高级标签助手特性50823.3.1创建缩写元素50823.3.2前置和追加内容与元素51023.3.3使用依赖注入获取视图上下文数据51223.3.4使用视图模型51423.3.5协调标签助手51623.3.6抑制输出元素51723.4小结518第24章使用表单标签助手51924.1准备示例项目51924.2使用form元素52124.2.1设置form目标52124.2.2使用防伪特性52224.3使用input元素52424.3.1配置input元素52424.3.2格式化数据52624.4使用label元素52824.5使用select和option元素52924.5.1使用数据源填充select元素53024.5.2从枚举中生成option元素53124.6使用textarea元素53524.7验证表单标签助手53624.8小结536第25章使用其他内置标签助手53725.1准备示例项目53725.2使用宿主环境标签助手53825.3使用JavaScript和CSS标签助手53925.3.1管理JavaScript文件53925.3.2管理CSS样式表54525.4使用超链接元素54725.5使用图像元素54825.6使用数据缓存54925.6.1设置缓存过期时间55125.6.2使用缓存变体55225.7小结555第26章模型绑定55626.1准备示例项目55626.1.1创建模型和存储库55626.1.2创建控制器和视图55826.1.3配置应用55926.2理解模型绑定56026.2.1默认绑定值56126.2.2绑定简单值56226.2.3绑定复杂类型56226.2.4绑定数组和集合57026.3指定模型绑定源57526.3.1选择标准绑定源57626.3.2使用请求头作为绑定源57726.3.3使用请求体作为绑定源57926.4小结581第27章模型验证58227.1准备示例项目58227.1.1创建模型58327.1.2创建控制器58327.1.3创建布局和视图58427.2理解模型验证的需求58627.3显式地验证模型58627.3.1为用户显示验证错误消息58827.3.2显示验证消息58927.3.3显示属性级验证消息59227.3.4显示模型级验证消息59327.4使用元数据指定验证规则59527.5执行客户端验证59927.6执行远程验证60127.7小结603第28章ASP.NETCoreIdentity入门60428.1准备示例项目60428.2设置ASP.NETCoreIdentity60728.2.1创建用户类60728.2.2创建数据库上下文类60828.2.3配置数据库连接串60828.2.4创建ASP.NETCoreIdentity数据库61028.3使用ASP.NETCoreIdentity61028.3.1列举用户账户61028.3.2创建用户61228.3.3验证密码61528.3.4验证用户详情62028.4完成管理功能62428.4.1实现删除功能62528.4.2实现编辑功能62628.5小结629第29章应用ASP.NETCoreIdentity63029.1准备示例项目63029.2验证用户63029.2.1准备实现验证63229.2.2添加用户验证63429.2.3测试验证63629.3使用角色授权用户63629.3.1创建与删除角色63729.3.2管理角色成员64129.3.3使用角色进行授权64429.4播种数据库64729.5小结650第30章ASP.NETCoreIdentity进阶65130.1准备示例项目65130.2添加自定义用户属性65230.2.1准备数据库迁移65430.2.2测试自定义属性65530.3使用声明和策略65530.3.1声明65630.3.2创建声明65930.3.3使用策略66130.3.4使用策略对资源授权访问66630.4使用第三方验证67030.4.1注册Google应用67030.4.2启用Google验证67130.5小结674第31章模型约定与操作约束67531.1准备示例项目67531.2使用应用程序模型和模型约定67731.2.1理解应用程序模型67831.2.2理解模型约定角色68031.2.3创建模型约定68031.2.4理解模型约定的执行顺序68431.2.5创建全局模型约定68531.3使用操作约束68631.3.1准备示例项目68731.3.2操作约束的作用68831.3.3创建操作约束68931.3.4在操作约束中处理依赖69231.4小结694
文章到此结束,如果本次分享的mvc40网站源码分享和web源码网站的问题解决了您的问题,那么我们由衷的感到高兴!