ASP.NET用户控件技术

ASP.NET波形显示控件开发实战 本文还有配套的精品资源,点击获取 简介:ZGraph是一个ASP.NET波形显示控件,适用于可视化显示波形数据。本课程设计项目将指导学生使用Visual Studio开发和自定义该控件,涵盖ASP.NET技术、控件设计、数据可视化和用户交互等方面。通过实践任务,学生将掌握波形显示控件的原理和应用,提升在电子工程、信号处理和自动化控制领域的技能。 1. ASP.NET基... 阅读详情
在前一篇文章当中,我们一同探讨了如何使用 ASP.NET中的代码绑定技术来使得代码重用变得简单可行。我们发现,利用代码绑定技术我们可以容易的将我们的代码和内容分离开来,利用它可以建立可重用的代码,只是这种技术本身也存在着一些局限性。在本文中,我们将会一同探讨另外一种新的ASP.NET技术:用户控件。
  
  什么是用户控件(User Controls)?
  为了能更好的理解用户控件的重要性,我们先来看看一段小小的“历史”。在以前的ASP当中,可重用的技术实现选择是相当受限制的。许多的开发者一般都是借助将公共的常用的子过程放到那些包含文件当中的做法来实现一定的所谓代码重用的。比如,如我们想要在许多的ASP页面当中现实一个下拉列表框,我会在一个包含文件当中建立一个函数,样子如下所示:
  
  Function GetListBox(asSelectedItem)
  '为HTML的选择控件建立字符串
  '返回这个字符串
  End Function
  
  当然,这样的做法的确在一定程度上做到了重用,但是为了能做到更加通用性,你不得不要增加更多的参数。为了使得类似上面的你需要整理的代码得以正常工作是困难的,因为要达到提供它的通用性(可重用性),你大概不得不去修改这些已经存在的代码,以便使得他们也能在新的环境下正常工作。
  IIS5中的VBScript5.0增加了建立类的功能。这就使得我们可以通过一个较多面向对象的方式来实现可重用的代码。
  
  Class ComboBox
  Property Let ControlName(vData)
  .
  End Property
   ies and methods here>
  End Class
  
  这样做会稍微好一些,但是开发者仍旧需要被迫去编写那些函数,以便返回HTML代码。而且,他也没有能力操纵那些类的实例对象的事件。为了能做到操作事件,开发者不得不建立一些COM组件,而后者则增加了应用程序的额外的复杂度。
  
  有了ASP.NET,我们拥有了一个新的简单的工具来编写可重用的代码—用户控件。用户控件(也叫pagelets)提供了这样一种机制,他使得我们可以建立能够非常容易的被ASP.NET页面使用或者重新利用的代码部件。一个用户控件也是一个简单的ASP.NET页面,不过它可以被另外一个ASP.NET页面包含进去。在你的ASP.NET应用程序当中使用用户控件的一个主要的优点是用户控件的支持一个完全面向对象的模式,使得你有能力去捕获事件。而且,用户控件支持你使用一种语言编写ASP.NET页面其中的一部分代码,而使用另外的一种语言编写ASP.NET页面另外一部分代码,因为每一个用户控件可以使用和主页面不同的语言来编写。
  
  
  建立一个用户控件
  在建立你自己的用户控件之前,你也许想知道在你的web页面中哪些可见的对象是能够重用的好的候选者。能可能的是,你将会在你的站点上的不止一个页面上需要使用融合的用户控件。一旦你开始不断的思考你的控件的结构,你就已经做好的开始的准备。在我们的例子当中,我们将要建立一个简单的搜索的控件,用来搜索SQL Server2000中的数据库Northwind。我们的搜索控件可以使得开发者快速的为一个web页面增加搜索能力。
  
  建立用户控件的第一步是建立一个.ascx文件。这是用户控件需要的文件扩展名。在一个一个.ascx文件中不能包含head,form,或者body标签,因为包含此.ascx文件的.aspx文件已经包含了这些标签。一个.ascx文件只能包含方法,函数,以及和用户控件相关的内同。
  
  在建立一个.ascx文件之后,我们想要为用户控件增加一些可视的代码。在一个用户控件当中可以包含所有的web控件。在我们的例子当中,搜索控件需要拥有一个标签,一个文本框以及一个按钮。我们首先加入这些web控件,因为我们的整个代码当中会涉及到这些对象。下面是具体的代码:
  
     
     
  
  
  在用户控件中有一件很酷的事情是,你可以定义你自己的属性。在我们的例子当中,我们会定义如下属性:
  
  。LabelText—描述显示给用户的搜索条件
  。ConnectiongString---用来联接到数据库的连接字符串
  。ResultSetView—包含了搜索结果的数据记录集
  。TableName—要搜索的数据库table名称
  。Condition—需要搜索的table的列的名称
  
  为了建立这些属性,我们使用一些联合起来的get和set方法来同属性结合起来。在做这些工作之前,我们需要首先决定一个属性是否需要允许读,写,还是两者都需要。对于只需要读的属性,我们将会使用ReadOnly关键字来限定属性的声明,并且仅仅包含了get方法。我们的ResultSetView属性是一个只读的属性,因此它的相关代码看起来如下:
  '这是一个只读的属性
  
  Public ReadOnly Property ResultSetView as dataView
  Get
  '设置返回属性地值
  ResultSetView = dsData.tables("BookTitles").defaultview
  End Get
  End Property
  
  对于只需要写的属性,我们将会使用WriteOnly关键字来限定属性的声明,并且仅仅包含了set方法。我们的TableName属性是一个只写属性,因此它的相关代码看起来如下:
  
  'This write only attribute identifies which table will be searched
  Public WriteOnly Property TableName as string
  Set
  '设置表的名称
  strTableName = Value
  End Set
  End Property
  
  对于那些既能读也能写的属性,在定义的时候就不需要加以限定了;并且同时包含了Get和Set方法。一旦这个属性被建立,.aspx文件就可以读取或者设置这些属性,使得用户控件可以适应一个或者多个用途了。
  
  在用户控件当中,和定义不同的属性相结合,你也需要定义任意的方法,这些方法可以被用户控件初始化。这些属性和方法定义了用户控件的功能。在我们的例子当中使用的是search方法。这个方法读取各个用户定义在.aspx文件中的控件属性,并且返回一个搜索的结果记录集。所有的操纵数据库的代码都在这个方法中了:建立SQL语句,打开数据库联接,并且从数据库中返回一个结果。
  
  '这个程序依照属性的值来操纵一个数据库
  Public Sub Search(sender As Object , e As System.EventArgs)
  Dim cnConnection As SQLConnection
  Dim cmdCo mmand As SQLDataSetCommand
  Dim strSearchString As String
  Dim strSQL As String
  '如果用户在搜索框中输入了条件
  If txtSearch.Text <> "" Then
  '过滤掉字符的前后空格
  strSearchString = trim$(txtSearch.Text)
  End If
  '建立我们的SQL语句
  strSQL = "SELECT * " & _
  "FROM " & strTableName & _
  " WHERE " & strConditionField & " LIKE '" & _
  trSearchString & "%'"
  '如果联接属性被设置了
  If strConnection <> "" Then
  '建立数据库联接
  cnConnection = New SQLConnection(strConnection)
  '打开数据库联接
  cnConnection.open()
  '为搜索建立一个新的command对象
  cmdCommand = New SQLDataSetCommand(strSQL, cnConnection)
  '建立一个新的DataSet对象
  dsData = New DataSet()
  '填充dataset对象
  cmdCommand.FillDataSet(dsData, "BookTitles")
  End If
  End Sub
  
  一旦你在你的用户控件当中添加了属性和方法,控件的开发也就大致完成了。
  现在我们对一个用户控件是如何建立的有了一个认识,让我们来看看用户控件是如何工作的。下面是我们的用户控件被包含在一个form当中的时候看起来的样子:  
  
  我们的用户控件将会放在一个国际食物网站的一个搜索页面上。为了建立这个搜索页面,我们先建立一个空的.aspx文件。我们先安排好所有的图片和布局,之后加入我们的用户控件。
  为了能够在一个.aspx页面当中使用这个新的用户控件,你必须首先初始化@Register指令。当使用这个标签的时候,你必须定义标签前缀,标签名字以及指定用户控件所在的源文件。
  
  <%@ Register TagPrefix="jav" TagName="Search" src="SearchControl.ascx" %>
  
  TagPrefix定义了我们使用这个用户控件的时候想要用的名称空间。TagName定义了这个用户控件的实际名称。你可以任意的命名你的控件,这个名字将会用在页面上面标示用户控件。
  当你加入一个用户控件到一个.aspx页面的时候,相应的语法同加入一个web控件类似。你首先使用标签前缀和标签名称来标示用户控件:
现在我们在页面上面有了这个空间,我们可以设置标准的runat和id属性,以及设置我们以前建立控件的时候建立的各个自己定义的属性。有两种方法来修改这些用户控件的属性(就像针对一个 ASP.NET的web控件那样)。一种方法是在你的web页面当中引用这个用户控件的时候明确的设置它的各个属性的值。在我们的例子当中,我们设置LabelText属性为“Product Name”,因为我们的搜索是针对产品名称来讲的。
  
  
  
  另外一种方法是在一个.aspx文件的page_load事件中设置这些用户控件的属性。针对我们的例子,我们在page_load事件当中设置ConnectionString,TableName,ConditionF ield属性。我们需要搜索的是数据库Northwind中Product表的ProductName字段。
  
  Sub page_load(objSource as Object, objArgs as eventArgs)
  Dim htConfig As HashTable
  '设置一个对Config.web文件中AppSettings节点的应用
  htConfig = Context.GetConfig("ap psettings")
  
  '设置用户控件的连接字符串
  userControl.ConnectionString=(htConfig("MyConn"))
  
  '设置我们要搜索的表的名称
  userControl.TableName="Product"
  
  '设置我们要搜索的字段名称
  userControl.ConditionField="ProductName"
  对于我们的web站点,我们将数据库的连接字符串存放在Config.web文件当中的叫做appsettings中的区域中。(如果要使用下面的代码,请将server修改成你实际的server名字)
  
  
  
  
  下面是我们的.aspx文件第一次看起来的样子:
  
  
  
  现在我们需要加入代码来调用我们的用户控件中的search方法。我们编写这个用户控件的例子的目的是为了实现对数据库的简单搜索以及返回搜索的结果。为了做到这些,我们有两个选择,我们要么在我们的用户控件当中将我们的结果放到我们的结果控件(在这里,一般是一个DataGrid控件),要么我们将一个ADO记录集当作一个属性返回给开发者,而不必关心开发者究竟使用什么方法来显示他。我们的选择是通过一个属性返回一个记录集结果,因为这样做可以使得开发者可以自由的选择使用什么控件以及采用什么样的数据显示方式。
  然而这个选择同时也带给了我们一些问题。我们可以容易的将结果当作一个属性返回并且使用DataSource属性绑定到一个DataGrid控件或者其他的控件。但是,我们如何才能知道用户是否是点击了一个搜索按钮呢?为了解决这个问题,我们需要在page_load事件中使用Page.IsPostBack这个属性。如果一个页面是由于post而重载的话,属性Page.Ispostback的值等于true。通过检测page.ispostback是否等于true,我们可以决定是否调用我们的用户控件中的Search方法,然后将结果绑定到我们的datagrid。
  
  '检测Page.IsPostBack属性的值
  If page.IsPostback = true then
  '执行搜索的动作
  userControl.Search(objSource, objArgs)
  '将结果绑定到DataGrid控件上面
  grdGrid.datasource = userControl.ResultSetView
  '正式绑定数据
  grdGrid.databind()
  End If
  End Sub
  在某个人输入了一个搜索条件之后并提交我们的.aspx文件之后的显示页面:
  
  
  
  现在我们可以同样的建立另外一个页面以便使用在我们的站点。我们将要建立的这第二个页面同样执行一个搜索动作,但是这次是要在Northwind数据库的表Company上的CompanyName字段上面进行搜索匹配。为了建立这个页面,我们建立一个新的空白.aspx文件。既然这个页面和我们的产品页面类似,我们使用相同的布局。我们将要再一次使用搜索用户控件。
  
  
  
  我们在这个页面会将属性设置不同的值。联接字符串还是保留使用前面同样的值。我们需要设置属性LabelText的值等于Company Name,设置属性Table的值等于Company,设置属性ConditionField的值等于CompanyName。通过对布局和用户控件的略微改动,我们就算大致完成了这个页面。对这个页面来讲,我们只需要很少的代码,这要好好谢谢用户控件带来的代码重用了。下面就是我们新的页面:
  
  
  
  正如你所看到的,用户控件可以提供一个简便的方法来实现代码的可重用性,而省去了很多不必要的麻烦。将相关的控件和代码从一个ASPX文件移到一个ASCX文件当中是一个恰当的做法,并且只需要较小的修改就可以使得代码正常的工作了。
  
  局限性?
  你也许会问自己:我使用用户控件不能够做到什么?使用这个技术只存在很少的一些限制。
  其中的一个限制是:用户控件不支持模版。因此,你不能建立一个用户控件来达到ASP.NET中提供的Data Repeater控件的功能。
  另外的一个限制是:由于用户控件必须包含一些静态的UI(用户界面)属性,所以你不能够按照你的想法严格的调整他们。比如,你可能想要建立一个包含多个控件的用户控件,并且允许开发者能够指定这些控件在页面上的显示顺序。上面的想法对于一个用户控件来说是困难的,因为UI块是被静态的设置的。
  
  结论
  用户控件提供了一个极好的方法使得你能够非常容易的在你的ASP.NET页面中实现代码的重用。将一些在ASP.NET中的代码拖放到ASCX文件中使得他们能够被重新利用是个正确的选择和做法。
  在我们的文章中,我们一同探讨了通过定制的控件实现代码在ASP.NET中的重用。可定制的ASP.NET控件可以对可重用代码提供附加的弹性,正如上面我们已经学到那样。
Calibre 3Dstack --每日一个命令day27【overlap】(3-27) 本文介绍了Calibre3Dstack中overlap命令的使用方法。该命令用于检查两个已放置层之间的重叠量是否符合要求,支持设置检查名称、层类型、堆叠范围、检查方向等参数。关键参数包括:-constraint指定重叠约束条件,-exact控制百分比精度,-by_area切换为面积检查模式,-intersection报告相交区域。检查结果可通过RVE选项定制显示方式,适用于3D堆叠设计中的层间重叠验证场景。 阅读详情

相关推荐

纽扣电池供电系统优化:NBM5100A与STM32F745VG组合方案

在低功耗物联网设备设计中,能量管理是核心挑战之一。纽扣电池因其体积小、成本低被广泛采用,但瞬时大电流需求常导致电压骤降和寿命缩短。通过超级电容缓冲技术,可以实现能量的细水长流式存储与集中释放。NBM5100A电源管理IC与STM32F745VG微控制器的组合方案,采用双阶段能量管理架构,先以恒定小电流充电,再通过电容释放大电流。这种方案不仅能提升系统稳定性,还能延长电池寿命3-5倍,特别适合智能门锁、无线传感器等需要间歇性高功率输出的场景。

weixin_29194255的博客 255

七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC

在进行本篇文章介绍之前,笔者推荐您在进行 ASP.NET MVC 开发的同时,还可以借助一些开发工具来快速完成开发工作。 例如:ComponentOne Studio ASP.NET MVC,它是一款轻量级控件,与Visual Studio无缝集成,完全与MVC6和ASP.NET 5.0兼容,将大幅提高您的工作效率。 系列文章 七天学会ASP.NET MV...

978

【Scrapy】Scrapy教程4——命令行工具

Scrapy支持使用模块设置自己的项目命令。如何实现可参考的实践方法。然后在项目的settings文件中配置来添加自定义命令。以上就是对Scrapy命令行工具的说明,有不明确的地方,可参考官方文档欢迎大家在各大平台关注我,我会不定期发布技术相关文章和各种小工具,并且欢迎共同技术探讨!

jayhgq的博客 1249

【.NET全栈】ASP.NET开发Web应用——用户控件和绘图

ASP.NET另一个强大功能就是能直接利用.NET内置的GDI+API在Web页面上进行创建图形,动态演示等。创建和使用用户控件为用户控件添加事件在Web页面中动态绘图。

杰西笔记 977

别再死记硬背Modbus报文了!用Python+Modbus Poll手把手教你调试工业设备

本文详细介绍了如何利用Python和Modbus Poll工具高效调试工业设备通信。通过实战案例和代码示例,帮助读者快速掌握Modbus通信协议的核心配置、数据监控技巧及Python自动化脚本编写,解决工业设备调试中的常见问题,提升工作效率。

weixin_42520780的博客 344

cadence Virtuoso ADE原理图库中的VCVS(压控电压源)使用

Symbol: vcvs (Voltage Controlled Voltage Source) Vop−Von=egain⋅(Vip−Vin)V_{op}-V_{on}=egain\cdot(V_{ip}-V_{in})Vop​−Von​=egain⋅(Vip​−Vin​) 所以可以得出 ⟹Vop=egain⋅(Vip−Vin)+Von\Longrightarrow V_{op}=egain\cdot(V_{ip}-V_{in})+V_{on}⟹Vop​=egain⋅(Vip​−Vin​)+Von​ 使

大学生视野 2万+

ASP.NET用户控件

什么是用户控件?用户控件是能够在其中放置标记和Wed服务器控件的容器,可以被看作一个独立的单元,拥有自己的属性和方法,并在被放入到ASPX页面上。其工作原理与ASP.NET页面非常相似。也可以这样理解:当一个Wed窗体被当作Server控件使用时,这个Wed窗体便是用户控件。用户控件可用来实现页面中可重用的代码,是可以一次编写就多处方便使用的功能块。它们是ASP.NET控件封装最简单的形式。由于它...

宋河锋的博客 730

GEE案例:计算区域生态总体脆弱性分析

计算区域生态总体脆弱性分析需要考虑多个指标和因素。下面是一个基本的方法:选择指标:选择一组能够反映区域生态系统脆弱性的指标。这些指标可以包括生物多样性指数、森林覆盖率、湿地保护率、土地退化程度等。为每个指标分配权重:为了使得各指标在计算中的重要性相对均衡,可以为每个指标分配一个权重。权重可以根据各指标的重要性和可利用的数据进行确定。数据收集和处理:收集每个指标的数据,并对其进行处理,确保数据的准确性和一致性。如果有需要,可以对数据进行归一化处理。计算指标值:根据收集的数据和权重,计算每个指标的值。

此星光明博客 464

ASP.NET MVC 中使用用户控件

周末加班,闲来无事,写篇博客,讲讲怎么在 ASP.NET MVC2中使用用户控件。首先我们新建一个用户控件, 我们命名为SelectGroup.ascx,代码如下 &lt;%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %&gt; &lt;script language="javascript" type...

weixin_33989780的博客 196

multisim14.3无法访问数据库...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 4438

零基础快速学习 ABAP 读者意见反馈和下一步写作计划表

大家在学习教程过程中,如果有任何关于 SAP ABAP 开发方面想了解的内容,可以直接在教程各篇文章下评论留言,我会将大家的意见统一汇总到下面的表格,作为我更新教程的内容参考来源之一。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4268

关于asp.net的代码重用

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 479

基于STM32L4XX、HAL库的 ATGM336H GPS定位模块驱动程序设计

/ 转换为km/h。// 定位状态: 0=无效, 1=GPS定位, 2=差分定位。// GPS解析数据。支持GPS/BeiDou/GLONASS/Galileo/QZSS多系统联合定位。// 回调函数(需要在HAL_UART_RxCpltCallback中调用)// 地面速度(km/h)// 海拔高度(m)

zhusl6688的博客 793

ASP.NET重用代码技术-用户控件技术

ASP.NET重用代码技术-用户控件技术   在前一篇文章当中,我们一同探讨了如何使用ASP.NET中的代码绑定技术来使得代码重用变得简单可行。我们发现,利用代码绑定技术我们可以容易的将我们的代码和内容分离开来,利用它可以建立可重用的代码,只是这种技术本身也存在着一些局限性。在本文中,我们将会一同探讨另外一种新的ASP.NET技术:用户控件。      什么是用户控件(User Control

随风自由 1180

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ASP.NET重用代码技术 - 用户控件技术

在前一篇文章当中,我们一同探讨了如何使用ASP.NET中的代码绑定技术来使得代码重用变得简单可行。我们发现,利用代码绑定技术我们可以容易的将我们的代码和内容分离开来,利用它可以建立可重用的代码,只是这种技术本身也存在着一些局限性。在本文中,我们将会一同探讨另外一种新的ASP.NET技术:用户控件。什么是用户控件(User Controls)?为了能更好的理解用户控件的重要性,我们先来看看一

1105

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[导入]ASP.NET重用代码技术 - 用户控件技术

ASP.NET重用代码技术 - 用户控件技术文章来源:http://blog.csdn.net/21aspnet/archive/2004/10/27/155104.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/10/28/816365.html...

weixin_30590285的博客 97

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

转贴一篇:ASP.NET重用代码技术 - 用户控件技术

ASP.NET重用代码技术 - 用户控件技术(苏红超 编译 2001年05月08日 20:05) 在前一篇文章当中,我们一同探讨了如何使用ASP.NET中的代码绑定技术来使得代码重用变得简单可行。我们发现,利用代码绑定技术我们可以容易的将我们的代码和内容分离开来,利用它可以建立可重用的代码,只是这种技术本身也存在着一些局限性。在本文中,我们将会一同探讨另外一种新的ASP.NET技术:用户控件。...

weixin_33735077的博客 77

ASP.NET自动检测用户名是否注册(利用微软AJAX控件技术)

ASP.NET自动检测用户名是否注册(利用AJAX技术)(在IE和Firefox运行通过) design by hakuci 代码下载 运行环境ASP.NET 2.0 , AJAX扩展包,SQLServer数据库,配置好开发环境后才可以运行本例子代码。 本代码基于三层架构 在空的解决方案里,添加项目:Model、DAL、BLL 、DBUtility和一个基于AJAX技术网站项目 M...

weixin_34176694的博客 263

ASP.NET中动态加载用户控件并传值

ASP.NET 页面:在此页面动态调用用户控件(.ASCX) 无标题页 ASP.NET 后台代码: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.S

天天天蓝的专栏 1679

ASP.NET主题、用户控件和母页版

主题和皮肤 一、同一控件多种定义的方法 有时需要对同一种控件定义多种显示风格,此时可以在皮肤文件(.skin文件)中,在控件显示的定义中用SkinID属性来区别 二、将主题文件应用于整个网站中 为了将主题文件应用于整个网站,可以在根目录下的Web.config中进行定义。 例如,要将Theme1租户提目录应用于网站所有页面,在Web.config文件中定义如下: <configuration> <system.web> <pages Theme="Theme1"

哈哈 816
上一篇: 在ASP.NET下实现数字和字符相混合的验证码
下一篇: 用户控件为什么要公开属性等
linuxdotnet
博客等级 码龄22年 1粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值