Page对象的学习

在ASP.NET中,Page是一个核心对象,它代表了一个ASP.NET Web Forms页面。每一个.aspx文件在运行时都会被编译成一个Page类的实例,这个实例承载了页面的所有功能,包括处理用户输入、与数据库交互、渲染HTML输出等。

在ASP.NET Web Forms中,Page对象是一个非常重要的组件,它代表了ASP.NET页面本身。当你创建一个ASP.NET Web Forms页面(通常是.aspx文件)时,服务器会自动为该页面创建一个Page类的实例,该实例提供了许多属性和方法来处理页面的各个方面。

以下是关于Page对象的一些关键学习点:

  1. 属性和方法

    • Request:获取有关客户端请求的信息,如查询字符串、表单数据等。
    • Response:用于向客户端发送响应,如HTML输出、重定向等。
    • Server:提供了许多服务器端的实用功能,如HTML编码、文件操作等。
    • Session:用于存储用户会话信息。
    • Application:用于在整个应用程序中存储信息。
    • IsPostBack:指示页面是否是由于用户提交表单而重新加载的。
    • LoadInitPreRender等事件:这些是页面生命周期中的关键事件,你可以在这些事件中编写代码来执行页面加载、初始化、渲染等操作。
  2. 页面生命周期
    了解ASP.NET页面的生命周期对于编写高效、可靠的代码至关重要。页面生命周期包括多个阶段,如初始化、加载、事件处理、渲染等。在适当的生命周期阶段执行特定的代码可以提高性能和减少错误。

  3. 控件
    Page对象可以包含各种ASP.NET控件,如文本框(<asp:TextBox>)、按钮(<asp:Button>)、标签(<asp:Label>)等。这些控件可以通过编程方式在代码中访问和操作,以执行各种任务,如验证用户输入、处理表单提交等。

  4. 事件处理
    当用户与页面上的控件交互时(例如,单击按钮或提交表单),会触发相应的事件。你可以通过编写事件处理程序来处理这些事件。事件处理程序是附加到控件事件的代码块,当事件发生时会自动执行。

  5. 数据绑定
    Page对象支持数据绑定,这意味着你可以将控件与数据源(如数据库、XML文件等)绑定在一起,以便自动显示和更新数据。数据绑定可以大大简化代码并提高可维护性。

  6. 导航和重定向
    使用Page对象的Response属性,你可以实现页面导航和重定向。例如,你可以使用Response.Redirect方法将用户重定向到另一个页面或网站。

  7. 自定义属性和方法
    虽然Page类提供了许多有用的属性和方法,但你也可以根据需要创建自定义属性和方法来扩展其功能。这可以通过在页面中添加自定义代码或使用用户控件来实现。

  8. 安全性
    在编写ASP.NET页面时,安全性是一个重要考虑因素。Page对象提供了一些内置的安全功能,如验证和授权。你可以使用这些功能来限制对页面的访问并保护敏感数据。

  9. 调试和错误处理
    使用ASP.NET的调试工具和错误处理机制,你可以轻松地诊断和修复页面中的错误。这包括使用Visual Studio的调试器、查看错误日志以及编写自定义错误处理程序来捕获和处理异常。

  10. 优化性能
    了解如何优化ASP.NET页面的性能对于创建高效的应用程序至关重要。这包括减少不必要的数据库访问、优化代码以减少内存使用以及利用缓存机制来存储和检索常用数据。

Page对象的常用属性

  1. IsValid:这个属性用来检查页面上的所有验证控件是否都通过了验证。如果所有验证控件的验证都成功,那么IsValid属性将返回true,否则返回false

  2. IsPostBack:这个属性用来判断当前请求是否是一个回发请求。如果是用户首次访问页面,IsPostBack将返回false;如果页面是由于用户操作(如点击按钮)而重新加载的,则返回true

  3. IsCrossPagePostBack:此属性用于判断页面是否使用跨页提交功能,即一个页面上的控件触发了另一个页面的回发事件。

Page对象的事件

ASP.NET页面的生命周期中会发生多个事件,开发者可以在这些事件中添加自定义逻辑。以下是一些关键事件:

  1. Page_Init:在页面初始化时触发,此时控件的视图状态已经被加载,但尚未应用控件的属性值。

  2. Page_Load:在页面加载时触发,此时所有控件的属性都已经设置,但尚未开始处理回发数据。

  3. Validate:在处理客户端或服务器端验证时触发,此时可以执行自定义的验证逻辑。

  4. Page_PreRender:在页面呈现之前触发,此时可以进行最后的页面或控件属性修改。

  5. Page_Unload:在页面卸载时触发,用于执行清理工作,如关闭数据库连接、释放资源等。

数据绑定

在ASP.NET中,数据绑定是将数据源中的数据与页面上的控件相关联的过程。Page对象本身不直接参与数据绑定,但页面上的控件可以使用数据绑定表达式(如<%# %>)来绑定数据源中的数据。数据绑定通常在Page_Load事件的处理程序中进行,特别是在!IsPostBack条件下,以确保数据只在页面首次加载时绑定。

自定义控件和用户控件

ASP.NET允许开发者创建自定义控件和用户控件来扩展页面的功能。自定义控件是从现有的ASP.NET控件派生出来的新控件,而用户控件则是将多个控件组合成一个可重用的单元。这些控件可以像其他ASP.NET控件一样在页面上使用,并通过Page对象进行交互。

安全性考虑

在处理Page对象时,安全性是一个重要的问题。开发者需要确保:

  • 输入验证:对用户输入进行严格的验证,以防止SQL注入、跨站脚本攻击(XSS)等安全问题。
  • 权限控制:确保只有经过授权的用户才能访问特定的页面或执行特定的操作。
  • 加密和哈希:对于敏感数据,如密码或会话标识符,应使用加密和哈希技术来保护它们的安全性。

性能优化

为了提高ASP.NET页面的性能,开发者可以:

  • 减少不必要的数据库访问:通过缓存数据、使用存储过程等方式来优化数据库操作。
  • 优化代码:避免在代码中执行昂贵的操作,如大量的字符串连接或不必要的循环。
  • 利用缓存:使用ASP.NET的缓存机制来存储和检索常用数据,以减少对数据库或外部资源的访问次数。

通过深入了解Page对象的属性和方法,以及与之相关的生命周期、事件处理、数据绑定等概念,开发者可以构建出功能强大、安全可靠的ASP.NET Web Forms应用程序。

IsPostBack属性:

IsPostBack属性:

在ASP.NET Web Forms中,IsPostBack属性是一个非常重要的属性,它用于判断当前页面请求是否是由于用户与页面上的控件(如按钮)进行交互(如点击按钮)而产生的回发(PostBack)请求。在Web Forms中,当用户与页面上的控件交互(如提交表单)时,页面会向服务器发送一个回发请求,然后服务器会重新加载页面并处理该请求。

IsPostBack属性的用途

  1. 区分首次加载与回发:在页面加载时,IsPostBack属性可以用来区分页面是首次被加载IsPostBackfalse还是由于用户交互产生的回发请求(IsPostBacktrue)。

  2. 优化页面加载:由于回发请求会重新加载整个页面,这可能导致一些不必要的操作(如重复的数据查询)。通过使用IsPostBack属性,你可以在页面加载事件中编写条件逻辑,以仅在页面首次加载时执行某些操作。

  3. 保持状态:在回发请求中,页面控件的状态(如文本框中的文本、复选框的选中状态等)会被保留并发送到服务器。IsPostBack属性可以帮助你确定是否需要处理这些控件的状态。

示例

以下是一个简单的示例,演示了如何使用IsPostBack属性来区分页面首次加载和回发请求:

protected void Page_Load(object sender, EventArgs e)  
{  
    if (!IsPostBack)  
    {  
        // 页面首次加载时执行的代码  
        // 例如,从数据库加载数据到页面上的控件  
        LoadData();  
    }  
    else  
    {  
        // 页面回发时执行的代码  
        // 例如,处理用户提交的数据  
        ProcessData();  
    }  
}  
  
private void LoadData()  
{  
    // 加载数据的代码  
    // ...  
}  
  
private void ProcessData()  
{  
    // 处理用户提交的数据的代码  
    // ...  
}

 在上面的示例中,当页面首次加载时,IsPostBack属性为false,因此会执行LoadData()方法来加载数据。当用户与页面上的控件交互并提交表单时,IsPostBack属性为true,因此会执行ProcessData()方法来处理用户提交的数据。

注意事项

  • IsPostBack属性仅在ASP.NET Web Forms中可用,对于ASP.NET MVC或ASP.NET Core MVC等基于MVC架构的应用程序,该属性不存在。
  • 在处理回发请求时,请确保正确处理页面控件的状态,并避免不必要的数据库查询或其他耗时操作。
  • 如果你在回发请求中修改了页面控件的状态(如将文本框的文本设置为新值),这些更改将在页面重新加载时反映给用户。但是,请注意,这些更改仅在当前回发请求的上下文中有效;如果用户刷新页面或导航到其他页面,则这些更改可能会丢失(除非你将它们保存在某种持久化存储中,如Session或数据库)。

 Title属性

在ASP.NET Web Forms中,Page对象代表了一个ASP.NET Web页面,并提供了许多属性和方法来控制页面的行为和外观。其中,Title属性是一个非常重要的属性,它用于设置或获取HTML页面的<title>元素的内容。

Title属性的用途

  1. 设置网页标题:通过Title属性,您可以为Web页面设置一个标题,这个标题会显示在浏览器的标题栏或标签页上。这对于用户来说非常有用,因为它可以帮助他们快速识别当前打开的页面。

  2. 搜索引擎优化(SEO):网页的标题对于搜索引擎优化(SEO)也很重要。搜索引擎通常会使用网页的标题作为搜索结果中的链接文本,因此一个清晰、描述性的标题有助于提高网页在搜索结果中的可见性。

示例

以下是一个简单的示例,演示了如何在ASP.NET Web Forms页面中设置Title属性:

protected void Page_Load(object sender, EventArgs e)  
{  
    if (!IsPostBack)  
    {  
        // 设置页面标题  
        this.Title = "欢迎来到我的网站";  
          
        // 其他页面加载时的逻辑...  
    }  
      
    // 其他页面逻辑...  
}

在上面的示例中,我们在Page_Load事件处理程序中检查IsPostBack属性。如果页面不是回发请求(即首次加载),则设置页面的标题为“欢迎来到我的网站”。

注意事项

  • Title属性直接对应HTML页面的<title>元素。当ASP.NET页面被渲染为HTML时,<title>元素的内容会被设置为Page对象的Title属性的值。
  • 您可以在页面的任何位置(包括在Page_Load事件处理程序之外)设置Title属性,但通常建议在页面加载时设置它,以确保在渲染页面之前标题已经被正确设置。
  • 如果您想在代码中动态地改变页面的标题(例如,根据用户操作或数据变化),您可以在需要的地方直接修改Title属性的值。
  • 请注意,Title属性只影响HTML页面的<title>元素的内容,它不会改变页面上的其他元素或控件。如果您需要更改页面上的其他文本或内容,您应该使用相应的控件属性或方法来实现。

IsValid属性 

在ASP.NET Web Forms中,Page对象的IsValid属性是一个布尔值属性,用于判断页面上的所有验证控件是否都通过了验证。当用户与页面上的控件进行交互并提交表单时,ASP.NET会检查页面上的验证控件(如RequiredFieldValidator、RangeValidator等),以确保输入的数据满足指定的验证规则。

IsValid属性的用途

  1. 验证用户输入IsValid属性允许您检查页面上的验证控件是否都已通过验证。如果所有验证控件都验证通过,则IsValid属性的值为true;否则,其值为false
  2. 控制表单提交:在提交表单之前,您可以使用IsValid属性来检查用户输入是否有效。如果IsValidfalse,则表明存在验证错误,您可以阻止表单提交,并向用户显示错误消息。

示例

以下是一个简单的示例,演示了如何使用IsValid属性来验证用户输入并控制表单提交:

 

protected void SubmitButton_Click(object sender, EventArgs e)  
{  
    if (Page.IsValid)  
    {  
        // 所有验证控件都已通过验证,执行表单提交的逻辑  
        // 例如,保存数据到数据库、发送电子邮件等  
        ProcessFormSubmission();  
    }  
    else  
    {  
        // 存在验证错误,阻止表单提交并向用户显示错误消息  
        // 您可以根据需要自定义错误消息和显示方式  
        ShowValidationErrorMessage();  
    }  
}  
  
private void ProcessFormSubmission()  
{  
    // 表单提交处理逻辑...  
}  
  
private void ShowValidationErrorMessage()  
{  
    // 显示验证错误消息的逻辑...  
    // 例如,将错误消息添加到页面的某个控件中  
}

在上面的示例中,当用户点击提交按钮时,会触发SubmitButton_Click事件处理程序。在该事件处理程序中,我们首先检查Page.IsValid属性的值。如果为true,则执行表单提交的逻辑;如果为false,则调用ShowValidationErrorMessage方法来显示验证错误消息。

注意事项

  • IsValid属性是基于页面上的验证控件的验证结果来设置的。因此,在使用IsValid属性之前,您需要确保已经在页面上添加了适当的验证控件,并正确设置了它们的验证规则。
  • IsValid属性仅反映当前页面上的验证控件的状态。如果页面包含跨页提交(IsCrossPagePostBack属性为true)或使用了其他自定义验证逻辑,则可能需要使用其他方法来检查验证状态。
  • 在处理验证错误时,请确保向用户提供清晰、明确的错误消息,以便他们了解输入的数据不符合哪些验证规则,并知道如何修正错误。

IsCrossPagePostBack属性 

IsCrossPagePostBack属性用于判断页面是否是通过跨页提交(Cross-Page Posting)加载的。

IsCrossPagePostBack属性的用途

  1. 跨页提交识别:当您希望从一个ASP.NET页面导航到另一个页面,并同时传递一些数据时,可以使用跨页提交。IsCrossPagePostBack属性允许您检查当前页面是否是由于跨页提交而加载的。
  2. 控制页面逻辑:基于IsCrossPagePostBack的值,您可以在页面加载时执行不同的逻辑。例如,您可能只想在跨页提交时执行某些操作,或者您可能想在跨页提交时更改页面的某些外观或行为。

示例

以下是一个简单的示例,演示了如何使用IsCrossPagePostBack属性:

protected void Page_Load(object sender, EventArgs e)  
{  
    if (IsCrossPagePostBack)  
    {  
        // 页面是由于跨页提交而加载的  
        // 执行跨页提交时的特定逻辑  
        ProcessCrossPagePostBack();  
    }  
    else  
    {  
        // 页面不是由于跨页提交而加载的  
        // 执行其他逻辑  
        ProcessNormalPageLoad();  
    }  
}  
  
private void ProcessCrossPagePostBack()  
{  
    // 跨页提交时的处理逻辑,例如获取上一个页面传递的数据  
    // ...  
}  
  
private void ProcessNormalPageLoad()  
{  
    // 正常页面加载时的处理逻辑  
    // ...  
}

 

在上面的示例中,Page_Load事件处理程序首先检查IsCrossPagePostBack属性的值。如果为true,则执行跨页提交时的特定逻辑;如果为false,则执行其他逻辑。

设置跨页提交

要在ASP.NET Web Forms中实现跨页提交,您需要在源页面的按钮或其他控件的PostBackUrl属性中指定目标页面的URL。当用户与该控件交互时,页面会导航到指定的目标页面,并传递查询字符串参数(如果需要的话)。在目标页面中,您可以使用PreviousPage属性来访问源页面的控件和属性。

注意事项

  • IsCrossPagePostBack属性仅与跨页提交相关。如果您没有使用跨页提交功能,则该属性的值始终为false
  • 当使用跨页提交时,请确保正确设置源页面的PostBackUrl属性,并在目标页面中处理从源页面传递的数据。
  • 跨页提交可能会影响页面的性能和用户体验,因为它涉及服务器往返和数据传输。因此,在决定使用跨页提交之前,请仔细考虑其他可能的解决方案,如使用AJAX、Web API或会话状态来在页面之间传递数据。

其他重要属性 

在ASP.NET Web Forms中,RequestResponseSession 和 Application 是非常重要的对象,它们提供了与HTTP请求和响应、用户会话以及应用程序状态相关的功能。以下是这些属性的详细讲解:

1. Request(HttpRequest 对象)

Request 对象用于访问客户端发送到服务器的 HTTP 请求中的信息。这包括:

  • 查询字符串:通过 Request.QueryString["key"] 访问。
  • 表单数据:对于 POST 请求,通过 Request.Form["key"] 访问。
  • HTTP 头:通过 Request.Headers["headerName"] 访问。
  • Cookie:通过 Request.Cookies["cookieName"] 访问。
  • 文件上传:通过 Request.Files 集合访问。
  • 服务器变量:如 Request.ServerVariables["SERVER_NAME"] 可以获取服务器名称。
  • URL 路径信息:如 Request.RawUrlRequest.UrlRequest.Path 等。

2. Response(HttpResponse 对象)

Response 对象用于从服务器发送 HTTP 响应到客户端。这包括:

  • 输出内容:使用 Response.Write() 方法发送文本内容到客户端。
  • 重定向:使用 Response.Redirect("url") 将用户重定向到另一个 URL。
  • HTTP 响应头:通过 Response.Headers.Add("headerName", "value") 设置自定义的 HTTP 响应头。
  • HTTP 状态码:使用 Response.StatusCode 设置 HTTP 响应的状态码。
  • 缓存控制:通过 Response.Cache 属性控制响应的缓存行为。
  • Cookies:通过 Response.Cookies["cookieName"] 发送 Cookie 到客户端。

3. Session(HttpSessionState 对象)

Session 对象用于存储与特定用户会话相关的信息。这些信息在用户浏览网站的不同页面时都是可用的,直到会话结束(通常是由用户关闭浏览器或会话超时)。

  • 存储数据:使用 Session["key"] = value; 存储数据。
  • 读取数据:使用 var value = Session["key"]; 读取数据。
  • 会话超时:通过 web.config 中的 <sessionState> 配置元素设置会话的超时时间。
  • 会话状态模式:ASP.NET 支持多种会话状态模式,如 InProc、StateServer 和 SQLServer。

4. Application(HttpApplicationState 对象)

Application 对象用于在整个 Web 应用程序中存储信息。这些信息在应用程序的所有用户之间共享,并且只要应用程序正在运行,这些信息就是可用的。

  • 存储数据:使用 Application["key"] = value; 存储数据。
  • 读取数据:使用 var value = Application["key"]; 读取数据。
  • 锁定和解锁:由于 Application 对象是多线程共享的,因此在访问或修改它时需要谨慎处理线程安全性。您可以使用 Application.Lock() 和 Application.Unlock() 方法来锁定和解锁 Application 对象。
  • 事件Application 对象还支持一系列的事件,如 Application_StartApplication_End 和 Application_Error,这些事件在应用程序的不同阶段触发。

这些对象在 ASP.NET Web Forms 应用程序中扮演着重要的角色,它们提供了与 HTTP 请求和响应、用户会话以及应用程序状态交互的功能。

Page对象的常用方法 

以下是一些Page对象的常用方法:

  1. Page_Load
    这是页面加载时自动触发的事件。在此事件中,您可以执行初始化代码、绑定数据等。

protected void Page_Load(object sender, EventArgs e)  
{  
    // 页面加载时执行的代码  
}

2.SetFocus
此方法用于将浏览器的焦点设置到指定的控件上。

TextBox1.SetFocus(); // 将焦点设置到TextBox1控件

 注意:实际上SetFocus是Web控件(如TextBox、Button等)的方法,而不是Page对象的方法。但您可以在Page_Load或其他事件处理程序中调用它。

3.FindControl
此方法用于在页面的控件集合中查找具有指定ID的控件。

Control myControl = this.FindControl("ControlID");

 如果控件在命名容器中(如Repeater、DataList等),您可能需要递归地调用FindControl

4.MapPath
虽然这不是Page对象的方法,但它是HttpServerUtility类的方法,通常通过Page.Server属性访问。此方法将虚拟路径转换为物理路径。

string physicalPath = Server.MapPath("~/path/to/file.txt");

5.Eval
实际上,Eval不是Page对象的方法,而是DataBinder类的一个方法,它经常与数据绑定一起使用。它用于在运行时计算数据绑定表达式。

string value = DataBinder.Eval(myDataSource, "PropertyName").ToString();

6.DataBind
虽然这不是Page对象的一个直接方法,但它是Control类的一个方法,Page类从Control类继承。此方法用于将数据绑定到控件。

myControl.DataBind();

或者,如果您想在整个页面上绑定数据,可以调用Page对象的DataBind方法(但这不是常见的做法,因为通常数据绑定是在控件级别上完成的)。

7.Response.Write
虽然这实际上是HttpResponse对象的方法,但您通常通过Page对象的Response属性来访问它。此方法用于将文本发送到输出流,该文本随后被发送到客户端。

Response.Write("Hello, World!");

8.Redirect
同样,这是HttpResponse对象的方法,但您可以通过Page.Response来访问它。此方法用于将用户重定向到新的URL。

Response.Redirect("newPage.aspx");

请记住,当调用Response.Redirect时,你应该确保在调用之后没有更多的代码执行,因为重定向会导致页面停止处理并发送重定向响应到客户端。如果需要执行一些清理代码(如关闭数据库连接),请确保在调用Redirect之前完成。

Page对象的常用事件

在ASP.NET Web Forms中,Page对象的常用事件主要涉及到页面的生命周期。以下是一些Page对象常用的关键事件:

  1. Page_Init
    在加载页面时,所有控件都已初始化并创建完成,但尚未加载任何视图状态或回发数据之前触发。这个事件是添加事件处理程序或执行其他初始化任务的理想位置。

  2. Page_Load
    在加载页面时,并且所有控件都已经加载了视图状态和回发数据之后触发。这是处理页面回发(例如,用户提交表单)和首次加载页面的最常见位置。开发者通常在这个事件中执行数据绑定和初始化控件的操作。

  3. Page_Unload
    在页面生命周期的最后阶段触发,即在页面卸载时,所有的控件都将被销毁之前。这是执行任何清理代码(如关闭数据库连接或释放资源)的好时机。

Page_Init和Page_Load的区别

Page_Init 和 Page_Load 是ASP.NET Web Forms页面生命周期中的两个重要事件,它们在页面的加载和初始化过程中扮演着不同的角色。以下是它们之间的主要区别:

Page_Init

  1. 触发时间Page_Init 事件在页面初始化时触发,发生在页面上的所有控件都已被创建但尚未加载任何视图状态或回发数据之前。

  2. 用途:此事件主要用于初始化页面或控件的属性,添加事件处理程序,或执行其他需要在页面加载之前完成的初始化任务。由于它在视图状态或回发数据加载之前发生,因此它是设置控件属性的理想位置,特别是当这些属性依赖于可能已更改的视图状态时。

  3. 执行次数对于同一个用户会话,Page_Init 事件只会在第一次请求页面时触发。如果页面是通过回发(如按钮点击)重新加载的,则不会再次触发 Page_Init 事件。

  4. 意思就是只执行一次

Page_Load

  1. 触发时间Page_Load 事件在页面加载时触发,发生在所有控件都已加载了视图状态和回发数据之后。这是处理页面回发(例如,用户提交表单)和首次加载页面的最常见位置。

  2. 用途:此事件通常用于执行数据绑定、检查回发数据的有效性、设置控件的默认值或执行其他需要在页面加载时完成的逻辑。由于此时已经加载了视图状态和回发数据,因此 Page_Load 是处理这些数据的理想位置。

  3. 执行次数对于每个页面请求(无论是首次加载还是回发),Page_Load 事件都会被触发。因此,在 Page_Load 事件处理程序中,您可能需要检查 Page.IsPostBack 属性以确定页面是否是通过回发重新加载的。

意思就是多次执行

总结

  • Page_Init 主要用于在控件加载之前进行初始化设置和添加事件处理程序。
  • Page_Load 主要用于处理页面回发和加载数据,以及执行其他需要在页面加载时完成的逻辑。
  • 由于 Page_Init 在 Page_Load 之前触发,因此在 Page_Init 中设置的控件属性可能会在 Page_Load 中被覆盖(如果也在 Page_Load 中设置了相同的属性)。
  • 在编写事件处理程序时,请确保了解它们的触发时间和用途,以便在适当的位置执行所需的逻辑。
  • 36
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值