.net html5 框架,ASP.NET - 介绍 ASP.NET Web 窗体框架的导航 | Microsoft Docs

MVC

07/08/2015

本文内容

介绍 ASP.NET Web 窗体框架的导航

ASP.NET Web 窗体框架的导航是一个托管在 navigation.codeplex.com 上的开源项目,该框架使您可以采用单元测试范围来编写 Web 窗体代码,同时遵循“切勿重复”(DRY) 原则,从而使 ASP.NET MVC 应用程序羡慕不已。

虽然存在一些放弃 Web 窗体并改为使用 MVC 的现象,但因为有些开发人员越来越厌倦大量代码隐藏不可进行单元测试,而使这一新框架(与数据绑定一起结合使用)成为用全新的眼光看待 Web 窗体的有说服力的理由。

使用 ObjectDataSource 控件进行的数据绑定自 Visual Studio 2005 以来已经形成,可允许对简洁的代码隐藏和数据检索代码进行单元测试,但是存在一些妨碍其实施的问题,例如,引发异常是将业务验证失败情况报告给 UI 的唯一方法。

为即将发布 Visual Studio 所做的绝大部分 Web 窗体开发工作均投入在了数据绑定上,借用 MVC 的模型绑定概念来解决这些问题,例如,引入模型状态来解决业务验证失败的通信问题。 但是,在与导航和数据传递相关的数据绑定方面仍留有两个难点,不过您可以使用 ASP.NET Web 窗体框架的导航(以下简称“导航框架”)将它们轻松剔除。

第一个难点是没有导航逻辑抽象,在 MVC 中它是被封装在控制器方法返回类型中。 这会在数据绑定方法内重定向调用,从而阻止其进行单元测试。 第二个难点是 ObjectDataSource 参数的类型确定其值来自哪里,例如,QueryStringParameter 总是从查询字符串中获取其数据。 这样会阻止在不同的导航上下文(如回发和非回发)中使用相同的数据源,使得在让人生畏的代码隐藏中没有实体逻辑。

导航框架可通过采用整体性的导航和数据传递方法来解决这些难点。 无论所执行导航的类型如何(可以是超链接、回发、AJAX 历史记录或单元测试),始终采用同一方式保留所传递的数据。 在以后的文章中,我将介绍这一点如何产生具有完全经过单元测试的数据检索和导航逻辑的空代码隐藏,以及对于启用和禁用 JavaScript 的方案如何产生无需代码复制的适合搜索引擎优化 (SEO) 且逐步增强的单页应用程序。 本文介绍了导航框架,并通过构建示例 Web 应用程序演示了有关导航框架的一些基本但很重要的概念。

示例应用程序

此示例 Web 应用程序是一项网上调查。 该调查只有两个问题并在完成后显示一则“thank you”(非常感谢)消息。 每个问题均由单独的 ASPX 页面表示,分别称为 Question1.aspx 和 Question2.aspx,而“thank you”消息也有其单独的页面,称为 Thanks.aspx。

第一个问题是“Which ASP.NET technology are you currently using?”(您现在正在使用哪种 ASP.NET 技术?),该问题可能的回答要么是“Web 窗体”要么是“MVC”。因此,对于 Question1.aspx,我将添加问题和硬编码的单选按钮回答:

Question 1

Which ASP.NET technology are you currently using?

第二个问题是“Are you using the Navigation for ASP.NET Web Forms framework?”(您使用的是 ASP.NET Web 窗体框架的导航吗?),其回答为“是”或“否”,可采用类似的方式进行标记。

开始使用

为使用导航框架而建立调查 Web 项目最直接的方法就是使用“NuGet Package Manager”(NuGet 程序包管理器)来安装它。 从程序包管理器控制台内运行“Install-Package Navigation”命令将添加所需的引用和配置。 如果您未使用 Visual Studio 2010,则可在 navigation.codeplex.com/documentation 中找到手动安装说明。

导航配置

导航框架可以看作是一个状态机,其中每一个不同的状态均表示一个页面,从一个状态移动到另一个状态或在页面之间进行导航称为转换。 这组预定义的状态和转换是在 NuGet 安装所创建的 StateInfo.config 文件中进行配置的。 如果没有此基础配置,运行调查应用程序将引发异常。

因为状态实质上就是页面,所以该调查应用程序需要三个状态,三个页面每个页面一个状态:

从现在起,我将使用其各自的键名来指代不同的状态,即 Question1、Question2 和 Thanks,而不使用它们表示的页面。

因为转换说明了状态之间可能的导航,所以调查应用程序需要两个转换。 一个是针对从 Question1 到 Question2 的导航,另一个是针对从 Question2 到 Thanks 的导航。 转换表现为要退出状态的子项,并通过其“to”(转换到)属性来指向要进入的状态:

对话框是配置的最后元素并表示状态的逻辑分组。 该调查应用程序只需要一个对话框,因为 Question1、Question2 和 Thanks 实际上是单一导航路径。 对话框的“initial”(初始)属性必须指向开始状态,也就是说,Question1:

您会注意到,每个对话框、状态和转换均有一个键属性。 我选择使用页面名称来给状态键命名,但没有必要这样做。 但要注意,所有的键在其父项内必须是唯一的;例如,您不能使用具有相同键的同级状态。

将 Question1.aspx 作为起始页,调查应用程序现在将以 Question1 状态成功启动。 但是,调查会一直滞留在此状态,因为没有办法继续进行到 Question2。

导航

将不同类型的 Web 窗体导航分为两大阵营是很有用的。 非回发阵营是控件从一个 ASPX 页面传递到另一个页面的地方,采用的是超链接、重定向或转移的形式。 回发阵营是控件一直处于同一页面的地方,采用的是回发、部分页面请求或 AJAX 历史记录的形式。 后者在以后讨论单页界面模式的文章中会加以说明。 在本文中,我将重点介绍第一种导航类型。

要在页面之间进行移动,必须建立一个 URL。 在 Visual Studio 2008 之前的版本中,唯一可用的选项是根据硬编码的 ASPX 页面名称手动构建 URL,这样会导致页面之间发生紧密耦合的现象,从而使应用程序非常脆弱且难以维护。 路由的引入缓解了此问题,并用可配置的路由名称代替了页面名称。 然而,路由在用于 Web 环境外部时会引发异常,这一事实加上路由对模拟的抗拒使路由成为单元测试的一大绊脚石。

导航框架会保留路由提供的松散耦合,并且不会对单元测试造成任何妨碍。 与路由名称的用法相似,这是上一节配置的对话框和转换键(代码中引用了这些键),而非硬编码 ASPX 页面名称;导航到的状态取决于各自的“initial”(初始)和“to”(转换到)属性。

返回到调查,“下一个”转换键可用于从 Question1 移动到 Question2。 我会将“下一个”按钮添加到 Question1.aspx,并将下面的代码添加到与其关联的单击处理程序中:

protected void Next_Click(object sender, EventArgs e)

{

StateController.Navigate("Next");

}

传递到 Navigate 方法的键与 Question1 状态所配置的子转换相匹配,随后即会显示由“to”(转换到)属性标识的状态,即 Question2。 我会将同一按钮和处理程序添加到 Question2.aspx。 如果您运行该调查,就会发现您可以通过单击“下一个”按钮在这三个状态中导航。

您可能已经注意到第二个问题是针对 Web 窗体的提问,如此一来,如果第一个问题的回答选择了“MVC”,则第二个问题就无关紧要了。 因此,需要更改代码来解决此问题,即直接从 Question1 导航到 Thanks,完全跳过 Question2。

当前配置不允许从 Question1 导航到 Thanks,因为所列出的转换只是到 Question2。 因此,我将通过在 Question1 状态下添加第二个转换来更改该配置:

有了这个新的转换,就可以很容易地调整“下一个”按钮单击处理程序以根据所选的答案来传递不同的转换键:

if (Answer.SelectedValue != "MVC")

{

StateController.Navigate("Next");

}

else

{

StateController.Navigate("Next_MVC");

}

不允许用户更改答案的调查将不会是好的调查。 目前,没有办法返回到上一个问题(除了浏览器后退按钮以外)。 要导航回上一页面,您可能认为需要在 Thanks 下面添加两个转换,分别指向 Question1 和 Question2,同时在 Question2 下面添加另一个转换,指向 Question1。 虽然这样操作也可以奏效,但是这是不必要的,因为后退导航功能是导航框架本身附带的。

痕迹导航是一组链接,使用户可访问每个当前所浏览页面的上一页面。 Web 窗体将痕迹导航内置于其站点地图功能中。 但是,由于站点地图由固定的导航结构来表示,因此,对于所给定的页面来说,这些痕迹始终相同,与所采用的路由无关。 它们无法处理调查中出现的有时排除 Question2 直接路由到 Thanks 的类似情况。 通过跟踪发生导航时访问的状态,导航框架可构建实际所采用路由的痕迹记录。

为了进行演示,我将超链接添加到 Question2.aspx,并在代码隐藏中使用后退导航以编程方式设置其 NavigateUrl 属性。 必须传递距离参数,以指示要返回到的状态有多少,值 1 意味着紧邻的前一状态:

protected void Page_Load(object sender, EventArgs e)

{

Question1.NavigateUrl = StateController.GetNavigationBackLink(1);

}

如果您运行应用程序且第一个问题的答案是“Web 窗体”,您将看到 Question2.aspx 上的超链接会将您返回到第一个问题。

我会对 Thanks.aspx 执行同样的操作,尽管这样做有点棘手,因为需要两个超链接(每个问题一个),且用户可能无法同时看到这两个问题(也就是说,如果他/她对第一个问题的回答是“MVC”)。 在决定如何设置超链接之前,可以先检查先前的状态数(请参见图 1)。

图 1 动态后退导航

protected void Page_Load(object sender, EventArgs e)

{

if (StateController.CanNavigateBack(2))

{

Question1.NavigateUrl = StateController.GetNavigationBackLink(2);

Question2.NavigateUrl = StateController.GetNavigationBackLink(1);

}

else

{

Question1.NavigateUrl = StateController.GetNavigationBackLink(1);

Question2.Visible = false;

}

}

现在,该调查功能正常,可允许您填写问题和修改先前的回答。 但是,如果这些回答不投入使用,那么调查几乎没有意义。 我将介绍回答数据是如何从 Question1 和 Question2 传递到 Thanks 的,在这里回答数据将显示在摘要窗体中。

数据传递

和导航一样,在 Web 窗体中传递数据的方式也是多种多样。 对于非回发导航,其中控件从一个页面传递到另一个页面(通过超链接、重定向或转移),可以使用查询字符串或路由数据。 对于回发导航,其中控件一直处于同一页面(通过回发、部分页面请求或 AJAX 历史记录),控件值、视图状态或事件参数可能是候选对象。

在 Visual Studio 2005 之前的版本中,代码隐藏承担处理此传入的数据,因此,它们充满了值提取和类型转换逻辑。 数据源控件和选择参数(在下一版本的 Visual Studio 中为“值提供程序”)的引入大大减轻了它们的负担。 然而,这些选择参数受限于特定数据源,它们无法根据导航上下文动态切换源。 例如,它们不能从控件或从查询字符串(具体取决于它是否为回发)中有选择地检索其值。 处理这些限制会导致代码回漏到代码隐藏,从而使问题退回到具有过多且不可测试的代码隐藏的起点。

导航框架可通过提供单一数据源(称为状态数据,无论涉及何种导航)来避免出现此类问题。 第一次加载页面时,状态数据将使用导航期间传递的任何数据来填充,方法类似于查询字符串或路由数据。 但是,显著的差别在于状态数据不是只读数据,因此当发生后续回发导航时,状态数据可以进行更新以反映页面当前最新内容。 当我在本部分末尾重新访问导航时,将证明这一点是非常有益处的。

我将更改调查,以便将第一个问题的回答传递到 Thanks 状态,在这里数据将重新显示在用户面前。 在通过键值对集合进行导航的同时传递数据,这称为 NavigationData。 我将更改 Question1.aspx 的“下一个”单击处理程序,以便将第一个问题的回答传递到下一个状态:

NavigationData data = new NavigationData();

data["technology"] = Answer.SelectedValue;

if (Answer.SelectedValue != "MVC")

{

StateController.Navigate("Next", data);

}

else

{

StateController.Navigate("Next_MVC", data);

}

此 NavigationData 是在导航期间传递的,用来初始化通过 StateContext 对象上的 Data 属性供下一个状态使用的状态数据。 我会将标签添加到 Thanks.aspx,并将该标签的 Text 属性设置为显示传入的回答:

Summary.Text = (string) StateContext.Data["technology"];

如果您运行该调查,则会注意到仅在第一个问题的回答是“MVC”时才显示此摘要信息;从不会显示“Web 窗体”的回答。 这是因为 NavigationData 只能用于下一个状态,但不可用于后续导航产生的所有状态。 因此,“Web 窗体”的回答存在于 Question2 状态数据中,但在到达 Thanks 时不可用。 解决此问题的一个方法是更改 Question2.aspx,以便它将回答中继到第一个问题,也就是说,在 Question2.aspx 导航时将回答从其状态数据中取出并将该回答传递到 Thanks:

NavigationData data = new NavigationData();

data["technology"] = StateContext.Data["technology"];

StateController.Navigate("Next", data);

这种方法并不理想,因为它将 Question1 和 Question2 紧密耦合到一起,强迫后者状态注意前者正在传入的数据。 例如,如果不对 Question2.aspx 进行相应的更改,就无法在第一个和第二个问题之间插入新的问题。 前瞻性的实施包括创建新的包含所有的 Question2 状态数据的 NavigationData;可通过向 NavigationData 构造函数传递 true 来实现这一点:

NavigationData data = new NavigationData(true);

StateController.Navigate("Next", data);

状态数据与查询字符串或路由数据之间的另一个关键的区别在于,采用状态数据您并不局限于传递字符串。 我会将一个布尔值传递给 Thanks(即用 true 值对应于“是”),而不是像对 Question1 和 Question2 所做的那样以字符串的形式传递答案:

NavigationData data = new NavigationData(true);

data["navigation"] = Answer.SelectedValue == "Yes" ?

true : false;

StateController.Navigate("Next", data);

您可以看到,在从 Thanks 状态数据中检索它后将保留其数据类型:

Summary.Text = (string) StateContext.Data["technology"];

if (StateContext.Data["navigation"] != null)

{

Summary.Text += ", " + (bool) StateContext.Data["navigation"];

}

该调查已完成,但还有一个问题: 使用后退导航超链接时问题的回答不会被保留。 例如,当从 Thanks 返回到 Question1 时,上下文即会丢失,因此默认的“Web 窗体”单选按钮始终处于选中状态,这与所给答案无关。

在上一部分中,您了解到后退导航相对于静态站点地图痕迹的优点。 站点地图生成的痕迹的另一个限制就是它们不携带任何数据。 这意味着跟随它们可能会丢失上下文信息。 例如,它们在从 Thanks 返回到 Question1 时无法传递先前选择的“MVC”答案。 通过跟踪与发生导航时访问的状态相关联的状态数据,导航框架可构建上下文相关的痕迹记录。 在后退导航期间,此状态数据将被还原,从而允许重新创建与之前完全相同的页面。

借助上下文相关的后退导航,我可以更改调查,从而在重新访问状态时使答案得到保留。 第一阶段是在离开页面之前,将回答设置到“下一个”单击处理程序中的状态数据中:

StateContext.Data["answer"] = Answer.SelectedValue;

现在,在重新访问 Question1 或 Question2 时,状态数据将包含之前选择的答案。 这样,采用 Page_Load 方法检索此答案和预先选择相关的单选按钮就是一件非常简单的事情:

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

if (StateContext.Data["answer"] != null)

{

Answer.SelectedValue =

(string)StateContext.Data["answer"];

}

}

}

调查现已完成,不容易受到在用户按下浏览器后退按钮(或同时打开多个浏览器窗口)时 Web 应用程序中经常遇到的错误的影响。 在特定于页面的数据保存在服务器端会话中时,通常会出现此类问题。 虽然只有一个会话对象,但是单个页面可能会有多个“当前”版本。 例如,使用后退按钮从浏览器缓存中检索“陈旧”版本的页面可能会造成客户端和服务器出现不同步情况。 导航框架就不会面临这类问题,因为它没有任何服务器端缓存。 实际上,状态、状态数据和痕迹记录均保留在 URL 中。 然而,这意味着用户可以通过编辑 URL 来对这些值进行更改。

使 MVC 羡慕嫉妒恨

之前我说过您可以使用导航框架创建 Web 窗体代码,使 MVC 羡慕嫉妒恨。 在一番大胆的言辞之后,您可能通过调查示例应用程序感觉到了一点小小的改变,因为这可能使 MVC 忍气吞声地避免其代码隐藏发出的不尽人意的气息。 但是请不要绝望;这仅仅是介绍核心概念。 后续文章将重点介绍体系结构的完整性,尤其会将着重点放在单元测试和 DRY 原则上。

在第二期中,我将采用空代码隐藏来构建一个数据绑定示例并完成单元测试代码范围。 此范围甚至会包括在 MVC 应用程序中号称测试老大难的导航代码。

在第三期中,我将构建 SEO 友好的单页应用程序。 在这里,将使用逐步增强的方式,在启用 JavaScript 时采用 ASP.NET AJAX,在禁用 JavaScript 时妥善降级,在这两种情况下使用的数据绑定方法相同。 同样,在 MVC 应用程序中很难办到这一点。

如果这激发了您的兴趣,您迫不及待地要尝试一些更多高级功能,请务必从 navigation.codeplex.com 中下载全面的功能文档和示例代码。

Graham Mendick 是 Web 窗体最忠实的粉丝,希望向大家展示 Web 窗体也能够像 ASP.NET MVC 一样拥有合理的架构。 他撰写了 ASP.NET Web 窗体框架的导航,他相信将其与数据绑定结合使用一定能给 Web 窗体注入新的活力。

衷心感谢以下技术专家对本文的审阅: Damian Edwards

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html教程padding,HTML CSS——margin和padding的学习

一、什么是边距CSS中的边距指的是当前元素border与周围其它元素border的距离(或者称为空间)。二、什么是内边距,什么是外边距代码2-1:html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.d…

html中最右边,html – 如何获得最右边的列填充剩余空间?

我找到了一个简单的解决方案:table td:last-child {width: 100%;}结果:body {font: 12px "Sans serif";}table {width: 100%;background-color: #222222;color: white;border-collapse: collapse;}table th {padding: 10px;text-align: left;}…

html5的交互标签,html5里交互元素的使用方法

在H5里,交互元素就是和用户进行互动的元素,这一部分非常的重要,并且和之前的JS控制的效果不同,H5相比于HTML增加了很多的交互元素,比如隐藏显示注脚就是其中的一个交互效果。交互元素的使用body{font-size: 12px;}span…

image 3d view HTML5,Cute Slider - 3D 2D HTML5 Image Slider

IMPORTANT!We can NOT provide support for this item since Feb 2015. If you would like to use our item, we highly recommend to use our brand new slider “Master Slider”Cute Slider is a unique and easy to use slider with awesome 3D and 2D transition effects,…

适合计算机社团活动的游戏,适合大学社团活动“游戏”有哪些?

20个适合大学生活动的游戏推荐1、无敌烽火轮规则:各组统一在风火轮内站好,由裁判统一发布口令出发。行进途中,风火轮必须垂直地面,不能将所提供的道具剪裁、折叠,道具纸必须紧密相连。所有组员必须在圈内,身体的任何部…

组策略 控制台登录计算机用用户,Window 2008 R2组策略之一——组策略管理控制台...

组策略管理在windows域管理中占有重要地位,本身也不是新的内容了。但微软在Windows2008中终于集成了一个非常好用的组策略管理工具——组策略管理控制台。并且为原有的组策略添加了新的元素。本文从介绍组策略管理控制台入手,力求通过比较通俗的语言&…

计算机桌面上的输入法状态栏,输入法状态栏

2009-05-02今天不知怎么的,把工具栏里输入法的图标给搞丢了。请问大侠怎样找回?请指点,谢谢任务栏系统托盘区的输入法图标不见了,点击运行输入Ctfmon。exe 回车即可。任务栏没有输入法的解决方法(先右击任务栏/工具栏/勾选语言栏试…

html按钮分享功能实现,一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)...

前几天由于工作需要制作一个分享按钮,考虑到后续其他项目可能也会用到,于是就打算写成插件化,正好也给我自己的插件jquery.hooray增加一个新的功能,为了不浪费大家时间,我先把demo放出来,如果觉得能用到&am…

北京理工大学珠海学院专业计算机类,北京理工大学珠海学院计算机学院网络工程专业...

北京理工大学珠海学院计算机学院网络工程专业发表时间:2019-10-10作者:211大学网日前,在计算机学院网络工程专业林开荣、张海燕老师的带领下,6名来自北京理工大学珠海学院2016级网络工程专业学生参加了珠海市职业技能竞赛云计算工…

国防科技大学计算机学院教员,我国最好的四所科技大学,第一名排名世界前列,还有一所是铁饭碗...

分享亲子快乐,交流教育知识,欢迎关注陆北老师2021年泰晤士世界大学排名揭晓,中国科技大学进入了前一百名,而南方科技大学也进入了前三百名。其实我国的科技类大学,以中国科技大学为首,有四所的实力非常雄厚…

计算机图形学基础教程论文,计算机图形学小论文

为毕业生写计算机图形学小论文提供计算机图形学小论文范文参考,涵盖硕士、大学本科毕业论文范文和职称论文范文,包括论文选题、开题报告、文献综述、任务书、参考文献等,是优秀免费计算机图形学小论文网站。计算机图形学的发展及应用探讨摘要计算机图形学…

c语言添加变量到数据库+a+ +b+ 的方法,《C程序设计基础》模拟考试题(含答案)...

《C程序设计基础》模拟考试题一、选择题(每题2分。共23道选择题)1、关于C程序的叙述,错误的说法是(B)A、C程序总是从主函数开始执行B、C程序中定义的第一个函数是主函数C、在主函数中可以调用其他函数D、一个C程序可以包括多个函数2、C语言的基本数据类型包括(A)A、…

长沙理工大学计算机网络试题,长沙理工大学考试试卷(计算机网络)要点.docx

长沙理工大学考试试卷????????????????????????????????????????卷 号1 教研室(或教 ) 名易建 教研室主任 名蔡碧野????????????????????????????????????????程名称(含档次) 算机网 原理与技…

暗黑3 和社群服务器连线中断,进入《暗黑3夺魂之镰》必须知道10件事

《暗黑破坏神3》首部资料片自去年德国科隆游戏展首次亮相之后已经过去两年时间,昨天凌晨2:00新版游戏正式在台湾上线(全球其它地区也在陆续开服中),同时台湾战网也向准备进入资料片的玩家给出了10点注意事项,了解这些将帮助大家更…

哔哩哔哩服务器在哪个文件夹,哔哩哔哩缓存在哪个文件夹 具体操作步骤

我们在手机b站中缓存了视频,如果想要找到源文件,就必须要在手机的内部存储中去寻找,实际上,手机b站缓存的视频隐藏的很深,其查看路径为:文件管理/本地/内部存储/android/data/tv.danmaku.bili/download/“随…

layui表单的ajax联动,layui的select联动实现代码

要实现联动效果注意两点:第一要可以监听到select的change事件;第二异步加载的内容,需要重新渲染后才可以 正常使用。html结构:所在省份:请选择省份${provincelist.fullname}#list>所在城市 :所在区域 &a…

超算和服务器性能,烽火GPU高性能服务器助力武大超算中心建设

近日,继“武汉大学100G高速网络及网格计算集群采购项目”中标后,烽火GPU高性能服务器再次中标“武汉大学GPU集群采购项目”。作为行业首例,此次烽火将在武大超算中心同时提供Intel KNL以及NVIDIA GPU超算解决方案,两种顶尖HPC方案…

ajax成功之后在执行,ajax传入成功后执行后台方法

做一个网站,再页面读取一段文字后,点击按钮,用ajax将文字传回后台,现在我希望ajax返回成功后,执行另外一段后台方法,请问有什么好方法吗?[WebMethod]public static string GetStr(string s){lin…

Ajax用证书调用,跨域的jQuery AJAX调用,带证书(Cross domain jQuery ajax call

我已经遵循以下步骤:获取服务器允许跨域调用(与所有的标题和东西) 这个工程测试服务器与一些跨域调用此作品获取服务器以强制证书这工作一起去参加一个浏览器的服务器上的文件,选择合适的证书,并看到该文件仍然有效现在,我们得到了…

C++PrimerPlus学习——第四章编程练习

**疫情期间学习C 4-1 需要使用cin.get()设置读取位数&#xff0c;避免空格导致无法读取多个词 #include <iostream> struct info_people //define structure {char first_name[20];char last_name[20];char grade;unsigned int age; }; int main() {using namespace std…