ASP.NET高级控件——Wizard控件

Wizard控件

Wizard Control

用户希望新应用程序能提供向导功能,以引导他们完成多步操作。这些用户界面都被施了魔法。抱歉,开个玩笑而已。

Wizards控件为用户提供了呈现一连串步骤的基础架构,这样可以访问所有步骤中包含的数据,并方便地进行前后导航。

MultiView控件类似,Wizard包含一个WizardStep对象集合。如图5-3所示,WizardStepView类继承,而且WizardStepWizard控件之间的关系与ViewMultiView的关系类似。

5-3View类的层次

MultiView控件一样,所有WizardStep中的所有控件都位于页面控件树中,且无论哪个WizardStep可见,都可以在运行时通过代码实现控件访问。当用户单击一个导航按钮或链接时,页面将被提交到服务器。但是,不支持将在第6章描述到的跨页提交。


Wizard控件负责导航,包括线性导航(从一步转到下一步或上一步)和非线性导航(从一步转到任意其他步)。该控件能够自动创建合适的按钮,例如NextPrevious以及Finish。第一步没有Previous按钮,最后一步没有Next按钮。通过设置可以使得一些步骤只能被导航一次。另外,默认情况下,Wizard控件显示一个包含导航链接的工具栏,这让用户可以从当前步骤转到其他步骤。

Wizard控件的所有外观特征几乎都可以通过样式和模板来自定义,包括各种各样的按钮和链接、标题和页脚、工具条和WizardStep

研究Wizard控件最好的方法是去查看一个示例。在这个示例中,将创建一个奇怪的向导来引导完成早晨醒来后需要做的事。

创建一个名为WizardDemo的网站。将一个Wizard控件拖到页面上。该控件默认包含一个两步的向导。虽然两个步骤有些少,但是功能是完整的。在设计视图中,将看到两个工具条链接和一个Next按钮,如图5-4所示。

5-4:设计视图中的Wizard控件

查看内容文件的源视图,将看到与以下代码类似的Wizard声明:

<asp:Wizard ID=”Wizard 1” runat=”server”>

   <WizardSteps>

      <asp:WizardStep ID=”WizardStep 1” runat=”server” Title=”Step 1” >

      </asp:WizardStep>

      <asp:WizardStep ID=”WizardStep 2” runat=”server” Title=”Step 2” >

      </asp:WizardStep>

   </WizardSteps>

</asp:Wizard>

<asp:Wizard>标签的内容是一对<WizardSteps>标签。WizardStep控件在这些标签中声明。


如果运行该页,那么将看到如图5-5所示的页面。因为这是第一步,所以只显示一个“Next”按钮,但工具条显示了两个步骤的链接。

5-5:默认的Wizard控件

现在让我们把这个示例打扮一下。单击WizardStep的内容区域,并输入一些文本,例如使用<h2>标签设置标题内容为“Wake Up”,如图5-6所示。

5-6:将内容添加到一个Wizard步骤

接下来,单击Wizard控件的智能标记并选择“Add/Remove”WizardStep,此时将打开WizardStep集合编辑器,如图5-7所示。再添加5个步骤后,总数将达到7个。为每一个步骤(包括前两个)输入一个标题值和ID值,如表5-2所示。

5-2  WizardDemoWizardSteps

ID

 

stpWakeUp

Step1

stpShower

Step2

stpTakeMeds

Step3

stpBrushTeeth

Step4

 


续表5-2  WizardDemoWizardSteps

ID

 

stpGetDressed

Step5

stpEatBreakfast

Step6

stpFinish

Step7

 

5-7WizardStep集合编辑器

尽管可以单击智能标记,依次选择每个步骤,并如同上面添加第一步一样添加内容,但是切换到源视图直接编辑WizardStep声明会更容易些。完成之后,Wizard控件的声明看起来类似于示例5-6

示例5-6:添加步骤后的Wizard控件声明

<asp:Wizard ID=”wzrdMorning” runat=”server”>

   <WizardSteps>

      <asp:WizardStep ID=”stpWakeUp” runat=”server” Title=”Step 1” >

         <h2>Wake Up</h2>

      </asp:WizardStep>

      <asp:WizardStep ID=”stpShower” runat=”server” Title=”Step 2” >

         <h2>Shower</h2>

      </asp:WizardStep>

      <asp:WizardStep ID=”stpTakeMeds” runat=”server” Title=”Step 3” >

         <h2>Take Medicine</h2>

      </asp:WizardStep>

      <asp:WizardStep ID=”stpBrushTeeth” runat=”server” Title=”Step 4” >

         <h2>Brush Teeth</h2>

      </asp:WizardStep>

      <asp:WizardStep ID=”stpGetDressed” runat=”server” Title=”Step 5” >


         <h2>Get Dressed</h2>

      </asp:WizardStep>

      <asp:WizardStep ID=”stpEatBreakfast” runat=”server” Title=”Step 6” >

         <h2>Eat Breakfast</h2>

      </asp:WizardStep>

      <asp:WizardStep ID=”stpFinish” runat=”server” Title=”Step 7” >

         <h2>Out the Door</h2>

      </asp:WizardStep>

   </WizardSteps>

</asp:Wizard>

Wizard控件有许多外观和行为属性。表5-3列出了一些除与按钮外观相关的属性之外的、最重要的属性。按钮外观相关的属性在表5-4中列出。在后面的WizardDemo示例中,将看到更多的属性。

5-3  与按钮外观无关的属性

 

 

 

ActiveStep

WizardStepBase

×

 

WizardsSteps集合中当前显示的步骤

ActiveStepIndex

Integer

×

×

WizardsSteps集合中当前显示的从0开始的步骤

CancelDestinationPageUrl

String

×

×

当用户单击取消按钮时要链接到的URL

CellPadding

Integer

×

×

单元格的内容与边框间的像素间距。默认值为0

CellSpacing

Integer

×

×

单元格间的像素间距。默认值为0

DisplayCancelButton

Boolean

×

×

如果为true,则显示一个取消按钮。默认值为false

DisplaySideBar

Boolean

×

×

如果为true,则显示一个工具条。默认值为false

FinishDestinationPageUrl

String

×

×

当用户单击完成按钮时要链接到的URL

FinishNavigationTemplate

ITemplate

×

×

用于指定完成步骤的导航区域的样式和内容的模板,包括最后的步骤和Step- Type=Finish的步骤

HeaderStyle

TableItemStyle

×

 

标题区域的样式属性

HeaderTemplate

ITemplate

×

×

用于指定标题区域的内容和样式的模板,标题区域位于每个步骤的顶部

 


续表5-3  与按钮外观无关的属性

 

 

 

HeaderText

string

×

×

在标题区域显示的文本

NavigationButtonStyle

Style

×

 

导航区域按钮的样式属性

NavigationStyle

TableItemStyle

×

 

导航区域的样式属性

SideBarButtonStyle

Style

×

 

用于指定侧栏上按钮外观的样式属性

SideBarStyle

TableItemStyle

×

 

侧栏区域的样式

SideBarTemplate

ITemplate

×

×

用于指定侧栏区域内容和样式的模板

SkipLinkText

string

×

×

为不可见图像呈现替换文本,以配合辅助技术。默认为“Skip Navigation Links”,默认值将根据服务器当前的区域设置进行本地化

StartNavigationTemplate

ITemplate

×

×

用于指定Start步骤的导航区域的内容和样式的模板。Start步骤是第一步或是StepType=Start的步骤

StepNavigationTemplate

ITemplate

×

×

用于指定一般步骤(StartFinishComplete以外的步骤)中导航区域内容和样式的模板

StepStyle

TableItemStyle

×

 

WizardStep对象的样式属性

WizardSteps

WizardStepCollection

×

 

WizardStep对象的集合

5-4  与按钮的显示相关的Wizard属性

 

 

 

CancelButtonImageUrl

FinishStepButtonImageUrl

FinishStepPreviousButtonImageUrl

NextStepButtonImageUrl

PreviousStepButtonImageUrl

StartStepNextButtonImageUrl

String

×

×

 

按钮上所显示图像的URL

CancelButtonStyle

FinishStepButtonStyle

FinishStepPreviousButtonStyle

NextStepButtonStyle

PreviousStepButtonStyle

StartStepNextButtonStyle

Style

×

 

 

用于指定按钮外观的样式属性

 


续表5-4  与按钮的显示相关的Wizard属性

 

 

 

CancelButtonText

FinishStepButtonText

FinishStepPreviousButtonText

NextStepButtonText

PreviousStepButtonText

StartStepNextButtonText

String

×

×

 

按钮上显示的文本

CancelButtonType

FinishStepButtonType

FinishStepPreviousButtonType

NextStepButtonType

PreviousStepButtonType

StartStepNextButtonType

ButtonType

×

×

ButtonImageLink

按钮类型

大部分属性是TableItemStyle类型。该类从System.Web.UI.WebControls.Style继承,它包含用于格式化组成Wizard控件的表格行和单元格的属性。TableItemStyle类有许多属性,包括BackColorBorderColorBorderStyleBorderWidthCssClassFontForeColorHeightHorizonalAlignVerticalAlignWidthWrap

当在VS2005设计视图中设置Wizard控件的属性时,属性窗口中的TableItemStyle类型的属性旁边会显示一个加号。单击这个加号展开TableItemStyle子属性列表,如图5-8所示。在内容文件的Wizard控件声明中,以这种方式设置的属性包含在单独的元素中,如下面代码段中高亮显示的代码。

<asp:Wizard ID=”Wizard 1” runat=”server” ActiveStepIndex=” 0” >

   <WizardSteps>

      <asp:WizardStep ID=”stpWakeUp” runat=”server” Title=”Step 1” >

         <h2>

            Wake Up</h2>

      </asp:WizardStep>

      <asp:WizardStep ID=”WizardStep 2” runat=”server” Title=”Step 2” >

      </asp:WizardStep>

   </WizardSteps>

   <HeaderStyle

      BackColor=”Gray”

      BorderColor=”Black”

      BorderStyle=”Solid”

      BorderWidth=”2px”

      Font-Size=”0.9em”

      ForeColor=”White”

      HorizontalAlign=”Center” />

</asp:Wizard>


 

5-8:设计视图中TableItemStyle类型的属性

在源视图中操作时,TableItemStyle类型的属性被列出并直接嵌入到Wizard控件声明中,它的格式如图5-9所示,下面的代码段高亮显示了嵌入式的属性声明。

<asp:Wizard ID=”Wizard 1” runat=”server”

   ActiveStepIndex=” 0”

   SideBarStyle-BackColor=”Yellow”

   SideBarStyle-BorderStyle=”Dashed”

   SideBarStyle-Font-Bold=”true”

   SideBarStyle-ForeColor=”Black”>

   <WizardSteps>

      <asp:WizardStep ID=”stpWakeUp” runat=”server” Title=”Step 1” >

        <h2>

            Wake Up</h2>

      </asp:WizardStep>

      <asp:WizardStep ID=”WizardStep 2” runat=”server” Title=”Step 2” >

      </asp:WizardStep>

   </WizardSteps>

</asp:Wizard>

WizardStep有一个StepType属性,这个属性的值是一个WizardStepType枚举值,该枚举在表5-5中列出。StepType默认为Auto,这时导航界面由WizardStep集合中步骤的顺序决定。第一步只有一个“Next”按钮,最后一步只有一个“Previous”按钮,其他的StepType值是Auto的步骤包含“Previous”“Next”两个按钮。

此外,可以为StepType设置一个不同的值以修改默认行为,表5-5列出了这些值。例如,把StepType设置为Complete,就可以创建一个不包含任何导航按钮的确认页。


 

5-9:源视图中TableItemStyle类型的属性。

5-5  WizardStepType的枚举值

 

 

Auto

声明步骤时的顺序决定了导航的界面,这是默认值

Complete

要显示的最后步骤,它不呈现导航按钮

Finish

最后的数据采集步骤,它只呈现被动完成和上一步两个按钮

Start

第一步,只呈现一个下一步按钮

Step

StartFinishComplete之外的任何步骤,它呈现上一步和下一步按钮

WizardStep类还包含一个特别有意思的AllowReturn属性。该属性可以强制线性导航。设置一个步骤的AllowReturn属性为false后,则只能导航到该步骤一次。如果DisplaySideBar属性为true(默认值),那么将显示侧栏。虽然AllowReturn属性设置为false的步骤仍然显示在导航链接中,但单击链接不会有任何反应。

提示:AllowReturn属性只禁止用户交互。即使该步骤的AllowRe- turn属性已经设置为false,程序代码也可以强制返回到一个步骤。

5-6列出了Wizard控件的6个事件,其中一个是ActiveStepChanged事件,在当前步骤改变时触发该事件。另外5个事件都由单击按钮触发。如表5-6所示,除了CancelButtonClick,其他的按钮单击事件都有一个WizardNavigationEventArgs类型的参数,它公开了3个属性:

Cancel

Boolean类型值。如果取消链接到下一步,则该值为true。默认值为false


CurrentStepIndex

0开始的WizardSteps集合中当前步骤的索引值。

NextStepIndex

0开始的将要显示的步骤的索引值。例如,如果单击了“Previous”按钮,则NextStepIndex的值比CurrentStepIndex值小1

5-6  Wizard事件

 

事件参数

 

ActiveStepChanged

EventArgs

显示新步骤时触发

CancelButtonClick

EventArgs

单击取消按钮时触发

FinishButtonClick

WizardNavigationEventArgs

单击完成按钮时触发

NextButtonClick

WizardNavigationEventArgs

单击下一步按钮时触发

PreviousButtonClick

WizardNavigationEventArgs

单击上一步时触发

SideBarButtonClick

WizardNavigationEventArgs

当单击侧栏区域中的按钮时触发

Wizard控件包含3个特别有意思的方法,如表5-7所示。

5-7  Wizard的方法

方法名称

返回类型

 

GetHistory

ICollection

返回一个按被访问的顺序排列的WizardStepBase 对象的集合,索引0 为最近访问的步骤

GetStepType

WizardStepType

步骤的类型,如表5-5所示

MoveTo

void

移动到参数中指定的WizardStep对象

现在回到WizardDemo示例。在该示例中,将应用刚才列出并讨论过的多个属性、方法和事件。

首先,为WizardStep中的每个WizardStep添加一些文本。每个步骤的内容可以包含文本和HTML,以及其他ASP.NET服务器控件和用户控件,以方便重用界面和代码。

接下来,设置第一步的StepType属性为Start,设置第7步的StepType属性为Finish。设置第3步的AlowReturn属性为false,这样只能访问该步骤一次。最后,再添加一个WizardStepWizardStep集合中,并设置StepType属性为CompleteWizard控件声明中的WizardStep部分看起来类似于示例5-7,修改的代码被高亮显示(除了添加的文本内容)。


示例5-7WizardSteps声明

<WizardSteps>

   <asp:WizardStep ID=”stpWakeUp” runat=”server”

      Title=”Step 1”

      StepType=”Start”>

      <h2>Wake Up</h2>

      Rise and shine sleepy head.

   </asp:WizardStep>

   <asp:WizardStep ID=”stpShower” runat=”server”

      Title=”Step 2” >

      <h2>Shower</h2>

      Make it cold!

   </asp:WizardStep>

   <asp:WizardStep ID=”stpTakeMeds” runat=”server”

      Title=”Step 3”

      AllowReturn=”False”>

      <h2>Take Medicine</h2>

      Only do this once.

   </asp:WizardStep>

   <asp:WizardStep ID=”stpBrushTeeth” runat=”server”

      Title=”Step 4” >

      <h2>Brush Teeth</h2>

      Don’t forget to floss.

   </asp:WizardStep>

   <asp:WizardStep ID=”stpGetDressed” runat=”server”

      Title=”Step 5” >

      <h2>Get Dressed</h2>

      Got to look good.

   </asp:WizardStep>

   <asp:WizardStep ID=”stpEatBreakfast” runat=”server”

      Title=”Step 6” >

      <h2>Eat Breakfast</h2>

      The most important meal of the day.

   </asp:WizardStep>

   <asp:WizardStep ID=”stpFinish” runat=”server”

      Title=”Step 7”

      StepType=”Finish”>

      <h2>Out the Door</h2>

      Meet the world!

   </asp:WizardStep>

   <asp:WizardStep ID=”stpComplete” runat=”server”

      StepType=”Complete”

      Title=”Complete”>

      <h2>Complete!</h2>

      Your morning routine is now complete.

   </asp:WizardStep>

</WizardSteps>

接下来,在页面上添加一个下拉列表控件和几个标签。这些标签将用于显示变量,下拉列表将用于说明如何在Wizard控件之外,以编程方式控制步骤导航。示例5-8中内容文件的代码段声明了这些控件。


示例5-8WizardDemo中的附加控件

<br />

Select a step:&nbsp;

<asp:DropDownList ID=”DropDownList 1” runat=”server”

AutoPostBack=”True”

OnSelectedIndexChanged=”DropDownList1_SelectedIndexChanged” >

   <asp:ListItem>1</asp:ListItem>

   <asp:ListItem>2</asp:ListItem>

   <asp:ListItem>3</asp:ListItem>

   <asp:ListItem>4</asp:ListItem>

   <asp:ListItem>5</asp:ListItem>

   <asp:ListItem>6</asp:ListItem>

   <asp:ListItem>7</asp:ListItem>

</asp:DropDownList>

<br />

<br />

Active Step:&nbsp;

<asp:Label ID=”lblActiveStep” runat=”server” />

<br />

ActiveStepIndex:&nbsp;

<asp:Label ID=”lblActiveStepIndex” runat=”server” />

<br />

StepType:&nbsp;

<asp:Label ID=”lblStepType” runat=”server” />

<br />

Button Info:&nbsp;

<asp:Label ID=”lblButtonInfo” runat=”server” />

<br />

<br />

<u>History</u>

<br />

<asp:Label ID=”lblHistory” runat=”server” />

回到“Design View”,单击Wizard控件的“Smart tag”,并选择“Auto Format”。在方案列表中选择一个方案。在本示例中,选择了“Simple”方案。正如将要看到的,该操作将会自动应用许多格式化属性。

Wizard控件的属性窗口中,设置DisplayCancelButton属性为true

在设计视图下选中Wizard控件,单击属性窗口中的事件图标(一个小闪电)。双击ActiveStepChanged旁边的单元格以便生成该事件的事件处理程序,并以默认名称(wzrdMorning_ActiveStepChanged)命名。以同样的方法为CancelButtonClick创建事件处理程序。对于FinishButtonClick事件,输入名称Button_Click,这将会在代码隐藏文件中插入以该名称命名的事件处理程序。最后,为每个NextButtonClickPreviousButtonClickSideBarButtonClick事件都输入Button_Click

切换到代码隐藏文件Default.aspx.cs。在文件顶部添加如下using声明:

using System.Collections;


这样,不用输入完整命名空间就可以使用ICollection对象,该对象是Wizard控件的GetHistory方法的返回值类型。

VS2005生成的事件处理程序的代码框架中,添加示例5-9中高亮显示的代码。

示例5-9WizardDemoDefault.aspx.cs的事件处理程序

protected void wzrdMorning_ActiveStepChanged(object sender, EventArgs e)

{

   lblActiveStep.Text = wzrdMorning.ActiveStep.Title;

   lblActiveStepIndex.Text = wzrdMorning.ActiveStepIndex.ToString(  );

   lblStepType.Text = wzrdMorning.ActiveStep.StepType.ToString(  );

 

   //  获取历史访问记录

   Icollection steps = wzrdMorning.GetHistory(  );

   string str = “”;

   foreach(WizardStep step in steps)

   {

      str += step.Title + “<br/>”;

   }

   lblHistory.Text = str;

}

 

protected void Button_Click(object sender, WizardNavigationEventArgs e)

{

   string str = “Current Index: “ +

         e.CurrentStepIndex.ToString(  ) +

         “.   Next Step: “ + e.NextStepIndex.ToString(  );

   lblButtonInfo.Text = str;

}

 

protected void wzrdMorning_CancelButtonClick(object sender, EventArgs e)

{

   lblActiveStep.Text = “”;

   lblActiveStepIndex.Text = “”;

   lblStepType.Text = “”;

   lblButtonInfo.Text = “Canceled”;

   wzrdMorning.Visible = false;

}

 

protected void DropDownList1_SelectedIndexChanged(object sender,

                                                  EventArgs e)

{

   DropDownList ddl = (DropDownList)sender;

   int index = ddl.SelectedIndex;

   WizardStepBase step = wzrdMorning.WizardSteps[index];

   wzrdMorning.MoveTo(step);

}

无论由用户操作触发还是由程序触发,当每次改变当前步骤时,都将执行ActiveStepChanged的事件处理程序wzrdMorning_ActiveStepChanged。该方法将获取


3个数据填充到标签中,并显示已访问步骤的历史记录。

第一个标签显示当前的活动步骤。Wizard控件的ActiveStep属性返回一个WizardStep对象。该对象的Title属性可获取活动步骤的标题。第二个标签由ActiveStepIndex属性值填充。由于它是整型值,所以必须将其转换为字符串。第三个标签显示WizardStep类的StepType属性,该属性是WizardStepType类型,因此,也要转换为一个字符串,才能赋值给TextBoxText属性。

然后,WizrdMorning_ActiveStepChanged方法调用Wizard类的GetHistory方法,该方法返回一个WizardStep对象的集合(准确地说,应该是WizardStepBase对象的集合,WizardStep从它继承)。遍历该集合并把每个步骤的Title属性添加到稍后要赋给lblHistory标签的字符串中。最近一次访问的步骤索引为0,它的上一个步骤索引为1,以此类推。

除了Cancel按钮以外,其他按钮和链接都使用同一个事件处理程序:Button_Click。该方使用当前步骤索引和下一个步骤索引填充lblButtonInfo标签,两个索引值都来自事件参数的属性。

Cancel按钮的单击事件处理程序wizrdMorning_CancelButtonClick,能够清空所有标签信息并隐藏Wizard控件。

页面上的DropDownList控件可以使您转到任何一个步骤。在它的SelectedIndex- Changed事件中,首先将sender对象转换为DropDownList类型,然后获取SelectedIndex属性值。该值被用作WizardStep集合中的索引来获取目标WizardStep对象的引用(实际上是WizardStepBase对象,WizardStep从它继承)。调用WizardMoveTo方法,实现以编程方式转到该步骤。有意思的是,它可以多次转到一个步骤,如步骤3,它的AllowReturn属性设置为false

设置事件处理程序及自动套用格式后,Wizard的声明现在看起来类似于示例5-10

示例5-10:设置事件处理程序及自动套用格式后的Wizard声明

<asp:Wizard ID=”wzrdMorning” runat=”server”

   DisplayCancelButton=”True”

   OnCancelButtonClick=”wzrdMorning_CancelButtonClick”

   OnActiveStepChanged=”wzrdMorning_ActiveStepChanged”

   OnFinishButtonClick=”Button_Click”

   OnNextButtonClick=”Button_Click”

   OnPreviousButtonClick=”Button_Click”

   OnSideBarButtonClick=”Button_Click”

   BackColor=”#E6E2D 8” BorderColor=”# 999999” BorderWidth=”1px”

   Font-Names=”Verdana” Font-Size=”0.8em” >

   <WizardSteps>

       <!--  unchanged from Example 5-7  -- >

  


</WizardSteps>

   <StepStyle BackColor=”#F 7F 6F 3” BorderColor=”#E6E2D 8”

         BorderStyle=”Solid” BorderWidth=”2px” />

   <SideBarStyle BackColor=”# 1C 5E 55” Font-Size=”0.9em”

         VerticalAlign=”Top” />

   <NavigationButtonStyle BackColor=”White” BorderColor=”#C5BBAF”

         BorderStyle=”Solid”

         BorderWidth=”1px” Font-Names=”Verdana”

         Font-Size=”0.8em” ForeColor=”# 1C 5E 55” />

   <SideBarButtonStyle ForeColor=”White” />

   <HeaderStyle BackColor=”# 666666” BorderColor=”#E6E2D 8”

         BorderStyle=”Solid” BorderWidth=”2px”

         Font-Bold=”True” Font-Size=”0.9em” ForeColor=”White”

         HorizontalAlign=”Center” />

</asp:Wizard>

运行该页面并在步骤间导航,如图5-10所示。

5-10:经过几次导航后的WizardDemo

Wizard 控件是一个定义非常明确又很容易使用的控件,它可以引导用户输入参数或完成一次销售。当需要让用户按一组定义好的步骤操作时, Wizard 控件是最好的选择。 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值