演练:在 Visual Web Developer 中创建和使用 ASP.NET 母版页

本演练阐释如何创建一个母版页和几个内容页。母版页使您可以创建一个页面布局(模板页),然后创建各个页面,这些页面包含的内容在运行时与母版页合并。有关母版页的更多信息,请参见 ASP.NET 母版页概述。

本演练中阐释的任务包括:

  • 在 Microsoft Visual Web Developer 中创建母版页。

  • 创建一个 ASP.NET 页,此页包含要在母版页中显示的内容。

  • 运行母版页以显示不同的内容。

  • 在运行时选择母版页。

先决条件

若要完成本演练,您需要:

Visual Web Developer (Visual Studio)。

.NET Framework。

(可选)可以用作母版页上的徽标的 .jpg、.gif 或其他图形文件。建议徽标的宽度不大于 48 像素。不过,可以根据需要决定是否显示徽标,而且图形的确切大小在本演练中并不重要。

创建网站

如果已经在 Visual Web Developer 中创建一个网站(例如,通过执行中的步骤创建),可以使用该网站并跳至下一节“创建母版页”。否则,按照下面的步骤创建一个新的网站和网页。

创建文件系统网站

打开 Visual Web Developer。

在“文件”菜单上单击“新建网站”。

出现“新建网站”对话框。

在“Visual Studio 已安装的模板”之下单击“ASP.NET 网站”。

在“位置”框中输入要保存网站页面的文件夹的名称。

例如,键入文件夹名“C:\WebSites”

在“语言”列表中,单击您想使用的编程语言。

单击“确定”。

Visual Web Developer 创建该文件夹和一个名为 Default.aspx 的新页。

创建母版页

母版页是用于设置页面外观的模板。在本节中,将首先创建一个母版页。然后,使用表格来对母版页进行布局,此母版页具有一个菜单、一个徽标和一个页脚,这些内容将在站点的每个页面中出现。还将使用内容占位符,这是母版页中的一个区域,可以使用内容页中的信息来替换此区域。

创建母版页

在解决方案资源管理器中,右击网站的名称,然后单击“添加新项”。

在“Visual Studio 已安装的模板”之下单击“母版页”。

在“名称”框中键入“Master1”。

选中“将代码放在单独的文件中”复选框。

注意

本演练假设您为所有页面使用代码隐藏文件。如果使用的是单一文件 ASP.NET 页,本演练中阐释的代码也可以使用,但将在源视图中显示,而不是在单独的代码文件中显示。

在“语言”列表中,单击您想使用的编程语言,然后单击“添加”。

即会在源视图中打开新的母版页。

在页面的顶部是一个 声明,而不是通常在 ASP.NET 页顶部看到的 声明。页面的主体包含一个 <asp:contentplaceholder> 控件,这是母版页中的一个区域,其中的可替换内容将在运行时由内容页合并。在本演练的稍后部分将更多地使用内容占位符。

对母版页进行布局

母版页定义站点中页面的外观。它可以包含静态文本和控件的任何组合。母版页还可以包含一个或多个内容占位符,这些占位符指定显示页面时动态内容出现的位置。

在本演练中,将使用一个表格来帮助在页面中定位元素。首先创建一个布局表格来保存母版页元素。在本节的稍后部分中将定位已经在页面上的内容占位符控件。

创建母版页的布局表格

在源视图中选定 Master1.master 文件,将验证的目标架构设置为 Microsoft Internet Explorer 6.0。若要设置此值,可以使用工具栏中的下拉列表,或从“工具”菜单中选择“选项”,然后单击“验证”。

切换到“设计”视图。

从“属性”窗口顶部的下拉列表中选择“DOCUMENT”,然后将“BgColor”设置为特别的颜色,如蓝色。

选择什么颜色并不重要。在本演练的稍后部分,将创建没有颜色的第二个母版页,与在这里选择的颜色形成对比。

单击要放置布局表格的页面。

注意

请勿将布局表格放在 控件内。

在“布局”菜单上单击“插入表”。

在“插入表格”对话框中单击“模板”。在列表中单击“页眉、页脚和边”,然后单击“确定”。

此模板定义表格中行和单元格的排列方式。选定的模板创建三个行,中间行拆分为两个单元格。

进行以下设置:

在中间行中,单击最左侧的列,然后在“属性”窗口中将其“宽度”设置为 48。

单击首行,然后在“属性”窗口中将其“高度”设置为 48。

单击末行,然后在“属性”窗口中将其“高度”设置为 48。

注意

可以通过拖动表格单元格的边框或在“属性”窗口中选择单元格并设置值,来设置宽度和高度。

选中表格中的所有单元格,将“BgColor”设置与背景色不同的颜色,然后将“VAlign”设置为“顶部”。

布局完表格后,可以将内容添加到母版页,此内容将在所有页面上显示。可以将版权信息添加为页脚,并添加一个菜单。如果有可用的徽标图形,也可以添加此徽标。

将静态内容添加到母版页

单击底部单元格,然后键入页脚文本,如“Copyright 2005 Contoso Inc.”

在“工具箱”中,从“导航”控件组将 控件拖动到顶部单元格中。

按照以下步骤创建菜单:

Menu 控件的 属性设置为 。

单击 Menu 控件上的智能标记,然后在“菜单任务”对话框中单击“编辑菜单项”。

在“项”之下单击“添加根节点”图标两次,添加两个菜单项:

单击第一个节点,然后将“Text”设置为“主页”,并将“NavigateUrl”设置为“Home.aspx”

单击第二个节点,然后将“Text”设置为“关于”,并将“NavigateUrl”设置为“About.aspx”

单击“确定”关闭“菜单项编辑器”对话框。

如果有可用作徽标的图形文件,请按照以下步骤将其放置到母版页上:

在解决方案资源管理器中,右击网站的名称,然后单击“添加现有项”。

定位到您的图形文件,选择该图形文件,然后单击“添加”。

在“工具箱”中,从“标准”组将 控件拖动到表格的左中列。

Image 控件的 属性设置为该图形文件的名称。

现在可以定位内容占位符,以指定母版页在运行时显示内容的位置。

添加内容占位符

ContentPlaceHolder 控件拖动到右中单元格中。

控件的 ID 属性为 ContentPlaceholder1。您可以保留或更改此名称。如果更改此名称,请记下更改的名称,因为稍后需要知道此名称。

保存页。

创建母版页的内容

母版页提供内容的模板。通过创建与母版页关联的 ASP.NET 页来定义母版页的内容。内容页是 ASP.NET 页的专用形式,它仅包含要与母版页合并的内容。在内容页中,添加用户请求该页面时要显示的文本和控件。

在本演练中,将为母版页添加两个带有内容的页面。第一个是主页,第二个是“关于”页面。

创建主页

在解决方案资源管理器中,右击网站的名称,然后单击“添加新项”。

在“Visual Studio 已安装的模板”下单击“Web 窗体”。

在“名称”框中键入“主页”

在“语言”列表中,单击您想使用的编程语言。

选中“选择母版页”复选框,然后单击“添加”。

出现“选择母版页”对话框。

单击“Master1.master”,然后单击“确定”。

即会创建一个新的 .aspx 文件。该页面包含一个 指令,此指令将当前页附加到带有 MasterPageFile 属性的选定的母版页,如下面的代码示例所示。

Visual Basic
<%@ Page Language="VB" MasterPageFile="~/Master1.master" ... %>

C#
<%@ Page Language="C#" MasterPageFile="~/Master1.master" ... %>

此页面还包含一个 <asp:Content> 元素,稍后将使用此元素。

内容页不具有常见的组成 ASP.NET 页的元素,如 htmlbodyform 元素。相反,通过替换在母版页中创建的占位符区域,仅添加要在母版页上显示的内容。

将内容添加到主页

切换到“设计”视图。

母版页中创建为 ContentPlaceHolder 控件的区域在新的内容页中显示为 控件。显示剩下的母版页内容,以便您查看布局,但这些内容显示为浅灰色,因为您在编辑内容页时不能更改这些内容。

从“属性”窗口的下拉列表中单击“DOCUMENT”,然后将“标题”设置为“Contoso 主页”

可以独立设置每个内容页的标题,以便内容与母版页合并时在浏览器中显示正确的标题。标题信息存储在内容页的 @ Page 指令中。

Content 控件中,键入“欢迎光临网站 Contoso”,选择该文本,然后将文本的格式设置为“标题 1”,方法是选择该文本,然后从“工具箱”上面的“块格式”下拉列表中选择“标题 1”。

按 Enter,在 Content 控件中创建一个新的空白行,然后键入“感谢您访问本站”

在这里添加的文本并不重要,可以键入任何有助于将此页识别为主页的文本。

保存页。

可以用与创建主页相同的方法创建“关于”页面。

创建“关于”页面

使用与创建主页相同的步骤添加名为 About.aspx 的新内容页。

请确定将新页面附加到 Master1.master 页,正如对主页的操作一样。

将页面的标题更改为“Contoso‘关于’页面”

在内容区域中,键入“关于 Contoso”,然后选择文本,并从“工具箱”上面的“块格式”下拉列表中选择“标题 1”,将文本的格式设置为“标题 1”。

按 Enter 以创建新行,然后键入“从 1982 年起,Contoso 一直提供优质的软件服务。”

保存页。

测试页面。

可以运行页以进行测试,正如运行任何 ASP.NET 页一样。

测试页面

切换到 Home.aspx 页,然后按 Ctrl+F5。

ASP.NET 将 Home.aspx 页的内容与 Master1.master 页的布局合并到单个页面,并在浏览器中显示产生的页面。请注意,此页的 URL 为 Home.aspx;浏览器中不存在对母版页的引用。

单击“关于”链接。

显示 About.aspx 页。它亦与 Master1.master 页合并。

引用母版页成员

内容页中的代码可以引用母版页上的成员,包括母版页上的任何公共属性或方法以及任何控件。在演练的此部分中,在母版页上创建一个属性,然后在内容页中使用此属性的值。前提是网站的公司名已作为属性存储在母版页中,且内容页中对公司名的任何引用都基于此母版页属性。

第一步是将属性添加到母版页。

将属性添加到母版页

切换到或打开 Master1.master 页。

在解决方案资源管理器中,右击“Master1.master”,然后单击“查看代码”打开代码编辑器。

注意

默认情况下,Visual Web Developer 创建使用代码隐藏模型的页面。如果愿意,可以使用单一文件模型来创建代码。有关更多信息,请参见 。

在类定义中键入以下代码。

Visual Basic
Public Property CompanyName() As StringGetReturn CType(ViewState("companyName"), String)End GetSet(ByVal Value As String)ViewState("companyName") = ValueEnd SetEnd Property

C#
public String CompanyName{get { return (String) ViewState["companyName"]; }set { ViewState["companyName"] = value; }}

此代码为母版页创建名为 CompanyName 的属性。在视图状态中存储此值,以便此值在回发之间保持不变。

在类定义中(但并非在属性代码中)添加以下代码。

Visual Basic
Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) _Handles Me.InitMe.CompanyName = "Contoso"End Sub

C#
void Page_Init(Object sender, EventArgs e){this.CompanyName = "Contoso";}

在本示例中,将 CompanyName 属性的值硬编码到页中。

现在可以修改内容页,以便使用母版页的 CompanyName 属性。

在内容页中引用 CompanyName 属性

切换到或打开 Home.aspx 页。

切换到“源”视图。

在页面顶部的 指令下添加下面的 指令:

<%@ MasterType virtualpath="~/Master1.master" %>

此指令将内容页的 Master 属性(即将使用此属性)绑定到 Master1.master 页。

切换到“设计”视图。

Content 控件中,将文本更改为“欢迎光临网站”

在“工具箱”中,从“标准”组将 控件拖动到 Content 控件上,并将其放置到静态文本的后面,使文本如下所示:

欢迎光临网站 [Label]

Label 控件的 属性设置为“CompanyName”

在解决方案资源管理器中,右击“Home.aspx”,然后单击“查看代码”打开代码编辑器。

在类定义中添加下面的代码。

Visual Basic
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) _Handles Me.Load    CompanyName.Text = Master.CompanyNameEnd Sub

C#
void Page_Load(Object sender, EventArgs e){   CompanyName.Text = Master.CompanyName;}

内容页的 属性返回对母版页的引用,此引用在步骤 3 中添加的 指令中定义。

现在可以测试内容页,以便确定它是否正确引用母版页的 CompanyName 属性。

测试对母版页属性的引用

切换到或打开 Home.aspx 页,然后按 Ctrl+F5 运行页面。

页面即会在浏览器中显示,其中文本为“欢迎光临网站 Contoso”。

关闭浏览器。

切换到或打开 Master1.master 代码隐藏页。

更改 Page_Init 处理程序,为属性赋一个不同的公司名,如下面的代码示例所示。

Visual Basic
Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) _Handles Me.InitMe.CompanyName = "New Company Name"End Sub

C#
void Page_Init(Object sender, EventArgs e){this.CompanyName = "New Company Name";}

切换到 Home.aspx 页,然后按 Ctrl+F5 以再次运行页面。

这次,更新的公司名显示在页面中。

使用母版页时还应注意其他几个问题:

在实际的应用中,可能将公司名等信息存储在配置文件中,并直接在内容页读取此信息。不过,在这里讲述的情形提供有关如何在内容页引用母版页成员的简单阐释。

即使没有包括 指令,也可以访问母版页上的成员。但是,若要执行此操作,必须将 System.Web.UI.Page.Master 属性强制转换为适当的母版页类型(如果页面没有母版页,则 Master 属性为 null)。有关更多信息,请参见。

可以使用 Master.FindControls 方法引用母版页上的控件。有关更多信息,请参见。

动态更改母版页

在某些情况下,可能希望能够动态更改母版页;也就是使用代码设置内容页的母版页。例如,可能希望允许用户从几个布局中进行选择,根据个人喜好设置母版页。

在演练的此部分中,将会把第二个母版页添加到网站,然后创建按钮使用户能够在两个母版页之间切换。因为两个母版页将会非常相似,所以制作第一个母版页的一个副本,对其进行修改,以用作第二个母版页。

制作一个母版页的副本

在解决方案资源管理器中,右击 Master1.master,然后单击“复制”。

右击网站的名称,然后单击“粘贴”。

即会将一个母版页添加到网站,名为“复件 master1.master”。

右击“复件 master1.master”,单击“重命名”,然后将新母版页命名为“Master2.master”

打开 Master2.master,然后在 指令中将 Master1 更改为 Master2

完成的页面指令类似于下面的代码示例。

Visual Basic
<%@ Master Language="VB" CodeFile="Master2.master.vb" Inherits="Master2" %>

C#
<%@ Master Language="C#" CodeFile="Master2.master.cs" Inherits="Master2" %>

切换到“设计”视图。

在“属性”窗口顶部的下拉列表中单击“DOCUMENT”。

清除“BgColor”属性。

新的母版页的外观和功能与 Master1.master 类似,但没有背景色。

打开 Master2.master 的代码文件,将母版页的代码隐藏文件中的类名从 Master1 更改为 Master2 以与页的 <%@ Master %> 指令中的 Inherits 属性的值相匹配。

代码类似于下面的示例。

Visual Basic
Partial Class Master2

C#
public partial class Master2 : System.Web.UI.MasterPage

下一步是向每个母版页添加一个按钮,此按钮允许用户选择备用母版页。

添加用于选择备用母版页的按钮

切换到或打开 Master2.master 页。

在“工具箱”中,从“标准”节点,将 控件拖动到页面上,并将其放置在顶部表格单元格中的菜单之下。

将按钮的 属性设置为“Colorful”

双击此按钮,为其 事件创建一个处理程序,然后添加以下突出显示的代码。

Visual Basic
Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As EventArgs)_Handles LinkButton1.Click    Session("masterpage") = "Master1.master"    Response.Redirect(Request.Url.ToString())End Sub

C#
void LinkButton1_Click(Object sender, EventArgs e){   Session["masterpage"] = "Master1.master";   Response.Redirect(Request.Url.ToString());}

此代码将备用母版页的文件名加载到一个持久的会话变量中,然后重新加载当前页。( 属性返回引用当前页的 对象。)很快将在使用母版页的名称的内容页中创建代码。

在“设计”视图中切换到或打开 Master1.master 页。

像在步骤 1 和 2 中一样添加一个 LinkButton 控件,并将其 Text 属性设置为“Plain”

双击 Plain 按钮,为其 Click 事件创建一个处理程序,然后添加下面突出显示的代码。

Visual Basic
Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As EventArgs)_Handles LinkButton1.Click    Session("masterpage") = "Master2.master"    Response.Redirect(Request.Url.ToString())End Sub

C#
void LinkButton1_Click(Object sender, EventArgs e){   Session["masterpage"] = "Master2.master";   Response.Redirect(Request.Url.ToString());}

此代码与 Master2.master 页中按钮的代码类似,不同之处在于它加载备用母版页。

现在在内容页中编写代码,此代码将动态加载用户选定的母版页。

编写代码以动态选择母版页

切换到或打开 About.aspx 页。

注意

已经创建的主页包含一个 指令,此指令实际上将此页绑定到单个母版页 (Master1.master)。因此,将无法动态地将母版页分配到主页,而是使用其他已创建的页。

在解决方案资源管理器中,右击“About.aspx”,然后单击“查看代码”打开代码编辑器。

在类定义中添加下面的代码。

Visual Basic
Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) _Handles Me.PreInitIf Not Session("masterpage") Is Nothing ThenMe.MasterPageFile = CType(Session("masterpage"), String)End IfEnd Sub

C#
void Page_PreInit(Object sender, EventArgs e){if(Session["masterpage"] != null){this.MasterPageFile = (String) Session["masterpage"];}}

此代码将当前页的 属性的值设置为会话变量中的值(如果有)。此代码必须在 Page_PreInit 处理程序中运行;它无法在任何晚于 Page_PreInit 处理程序发生的处理程序中运行(例如,在 Page_Init 处理程序中),因为必须建立母版页,使得页面可以创建其实例,然后可以进一步初始化。

现在可以测试动态母版页。

测试动态母版页

在 About.aspx 页中按 Ctrl+F5 运行此页面。

此页即会在浏览器中显示,它与其默认母版页 Master1.master 合并。

单击“Plain”链接。

即会重新显示此页,这一次它与没有背景色的 Master2.master 合并。

单击“Colorful”链接。

再次使用 Master1.master 显示该页。

使用动态母版页时还应注意其他几个问题:

为了使本演练专注于母版页,本节中更改母版页的情形已经简化。在实际应用中,很可能显示备选的一些布局,然后使用配置文件存储用户的首选项。有关详细信息,请参见 。

可以配置网站,使所有页面使用相同的母版页。可能会有几个页应使用备用母版页,可以用类似于本演练的此节中演示的方式在代码中进行配置。有关详细信息,请参见 中的“设置母版页范围”。

需要将 Home.aspx 页中的代码添加到想要重写默认母版页的每个页面上。

后续步骤

本演练阐释了母版页的基本功能。您可能想要尝试母版页的其他功能。例如,您可能希望:

创建带有多个内容占位符的母版页。然后,可以使用显示的每个页面的内容来填充一个或多个占位符。

定义具有默认内容的内容占位符。如果 ASP.NET 页不提供占位符的内容,母版页将显示默认内容。

以编程方式从内容页访问母版页的成员。这使您能够动态地更改运行时母版页的外观。有关详细信息,请参见。

对母版页使用设备筛选,为不同的设备创建不同的布局,如为浏览器创建一个布局,而为特定类型的电话创建另一个布局。有关详细信息,请参见 。

了解如何将母版页放置在母版页内,以便创建组件化页面。有关详细信息,请参见。

转载于:https://www.cnblogs.com/leup/archive/2007/09/29/911214.html

[摘自MSDN] ASP.Net2.0学习 [1] 母版页 2 : 创建和使用 ASP.NET 母版页相关推荐

  1. asp.net2.0学习历程 菜鸟到中级程序员的飞跃【月儿原创】

    asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.5.1 ...

  2. asp.net2.0学习历程 菜鸟到中级程序员的飞跃[z转]

    asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 学历历程 如果你是一个菜鸟或者自认为初学者那么本文非常适合你: 不能说这30本书就是最佳组合,但是可以说这个组合不差: 本人曾 ...

  3. asp.net2.0学习历程 菜鸟到中级程序员的飞跃 转载

    asp.net2.0学习历程 菜鸟到中级程序员的飞跃 --30本好书点评 主页:http://blog.csdn.net/21aspnet/           时间:2007.5.16 学历历程 如 ...

  4. asp.net2.0学习历程 菜鸟到中级程序员的飞跃

    如果你是一个菜鸟或者自认为初学者那么本文非常适合你: 不能说这30本书就是最佳组合,但是可以说这个组合不差: 本人曾博览群书,很多书重复,很多书讲的不适用,这些书都是目前书店可以买到的: 达到中级程序 ...

  5. asp.net2.0学习指导 菜鸟到中级程序员的飞跃

          [导语] 自从小编进入图书行业以来就经常被朋友们作为图书指导,经常会被追问到学习这个个语言应该买那些书?学习那门技术看什么书好?在查看读者留言时也经常能看到这样的留言,为此我们图书频道和d ...

  6. [摘自MSDN] ASP.Net2.0学习 [1] 母版页 7 : 母版页和内容页中的事件

    ASP.NET ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事 ...

  7. [摘自MSDN] ASP.Net2.0学习 [2] 主题 1 :ASP.NET 主题和外观概述

    ASP.NET 主题和外观概述 主题是属性设置的集合,使用这些设置可以定义页面和控件的外观,然后在某个 Web 应用程中的所有页.整个 Web 应用程序或服务器上的所有 Web 应用程中一致地应用此外 ...

  8. Asp.net2.0 学习资源(转载)

    asp.net 2.0 http://beta.asp.net/QUICKSTART/aspnet/ http://msdn.microsoft.com/vstudio/express/vwd/lea ...

  9. ASP.NET2.0学习8--WebPart部件

    WebPart学习 内容: 功能简介 webpart的五个模式 自定义webpart部件 一.Webpart功能简介 1. 自定义页面内容 2. 自定义页面布局 3. 导入.导出webpart 4.  ...

最新文章

  1. 还在用Jenkins?试试Gitlab的CI/CD功能吧,贼带劲!
  2. Java 8 开发的 4 大顶级技巧
  3. 录音文件下载_苹果手机录音常见问题解答
  4. ntv.js框架(第三章) - 机顶盒HTML和CSS编写注意事项
  5. seaborn绘图入门1(lineplot+barplot+heatmap+scatterplot)
  6. usb连接不上 艾德克斯电源_艾德克斯HT3150联机和IT6720校准联机记
  7. Android 推送通知指南(转载)
  8. [emacs] 用 ido 或 anything 进行选择
  9. 支付宝小程序封装请求
  10. 大学毕业4年-回顾和总结(6)-技术研发-重构之法
  11. 计算机网络基础(TCP/IP)
  12. Python量化分析应该怎么做 ?
  13. 163VIP邮箱全新域名上线,见证蜕变开启全新的VIP邮箱体验!
  14. 23个经典营销创业案例,彻底颠覆你的营销思维
  15. matlab汽车驱动力与行驶阻力,汽车理论课程设计:基于Matlab的汽车动力性的仿真...
  16. 02.模块二 JDBC技术和XML
  17. Java 编程高手(附盘) 译作者: 博彦科技
  18. nuxtjs 服务端渲染从开发到发布的流程
  19. PaddlePaddle飞桨《高层API助你快速上手深度学习》『深度学习7日打卡营』--自定义数据集OCEMOTION–中文情感分类
  20. 英语文章关于计算机的,关于计算机的雅思英语作文范文

热门文章

  1. svn迁移,备份,重装系统后恢复数据 收藏
  2. BZOJ.4199.[NOI2015]品酒大会(后缀自动机 树形DP)
  3. html图片标签和语义化标签和音频
  4. 学习 Swift 的知识点整理
  5. 权限不同,设置标签绑定的事件生效与不生效(使事件不起作用)
  6. JavaScript的数组常用方法
  7. 解决Eclipse一直loading workbench无法启动的问题
  8. C++文本操作.Vs.Python
  9. 获取验证码canvas
  10. 总结的linux 基础命令