asp.net MVc 数据验证

【ASP.NET MVC4】第八课:MVC数据验证、验证特性、自定义验证 知识点:MVC数据验证概述、验证属性的使用、自定义验证、扩充基于 Entity Framework 的数据模型。 ASP.NET MVC 中的视图(View)负责向用户呈现操作界面、收集数据并传回服务器。在用户使用过程中,由于用户疏忽或恶意原因,用户输入数据对系统可能存在各种隐患,因此需要对从用户界面收集的数据进行各种规则的验证,确保数据符合系统要求。 1、MVC 数据验证概述 Web应用程序必须对用户输入进行验证,不仅需要在客户端进行验证,在服务器端也需要进行验证。客户端进行验证会对用户.. 阅读详情
 asp.net mvc 之 asp.net mvc 3.0 新特性之 Model:
  • 通过 Data Annotations 与 jQuery 的结合实现服务端和客户端的双重验证
  • 双重验证中,使客户端实现远程的异步验证
  • 自定义 Data Annotations 与 jQuery,以实现自定义的双重验证


示例
1、Model 中通过 Data Annotations 与 jQuery 的结合实现服务端和客户端的双重验证
Web.config
<configuration>
    <!--
        要实现服务端和客户端的双重验证,需要做如下配置,因为双重验证中的客户端验证需要依赖此配置
    -->
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>

User.cs
/*
 * 在 asp.net mvc 3.0 中支持通过 Data Annotations 来实现服务端和客户端的双重验证,需要 jQuery 的支持
 * 所有 Data Annotations 相关的 Attribute 直接用类视图看 System.ComponentModel.DataAnnotations 就行了,详细说明以前写过好多遍了,这里就不重复了
 * 另外 System.Web.Mvc 下有一些新增的 Data Annotations
 */
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
  
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
  
namespace MVC30.Models
{
    public class User
    {
        public int ID { get; set; }
          
        [DisplayName("名字")]
        [Required(ErrorMessage = "名字不能为空")]
        public string Name { get; set; }
  
        [DisplayName("密码")]
        [Required(ErrorMessage = "密码不能为空")]
        public string Password { get; set; }
  
        [DisplayName("确认密码")]
        [Required(ErrorMessage = "确认密码不能为空")]
        [Compare("Password", ErrorMessage="两次密码输入不一致")]
        public string ConfirmPassword { get; set; }
  
        public DateTime DateOfBirth { get; set; }
  
        // 请求时,允许此字段包含 HTML 标记
        [AllowHtml]
        public string Comment { get; set; }
    }
}

ValidationDemoController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
  
using MVC30.Models;
  
namespace MVC30.Controllers
{
    public class ValidationDemoController : Controller
    {
        // 用于演示通过 Data Annotations 实现服务端和客户端的双重验证
        public ActionResult Validation_DataAnnotations()
        {
            var user = new User { ID = 1, Name = "webabcd", DateOfBirth = new DateTime(1980, 2, 14), Comment = "<b>mvp</b>" };
  
            return View(new User());
        }
  
        [HttpPost]
        public ActionResult Validation_DataAnnotations(User user)
        {
            return View(user);
        }
    }
}

Validation_DataAnnotations.cshtml
@model MVC30.Models.User
             
@{
    ViewBag.Title = "Validation_DataAnnotations";
}
  
<h2>ClientValidation</h2>
  
<!--
    通过 jQuery 实现客户端验证的逻辑,需要引用此 js
-->
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<!--
    服务端验证与客户端验证的一一对应需要引用此 js
-->
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
  
@*
在 MVC3 中实现客户端验证,不需要添加以下代码
@{ Html.EnableClientValidation(); }
*@
  
@using (Html.BeginForm())
{
    <fieldset>
        <legend>User</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
            (测试方法:空着文本框,然后提交)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}


2、Model 中通过 Data Annotations 与 jQuery 的结合实现服务端和客户端的双重验证,其中客户端可以实现远程的异步验证
User.cs
/*
 * System.Web.Mvc.Remote(string action, string controller) - 让客户端可以通过 ajax 的方式远程验证
 *     action - 实现验证逻辑的 action,即处理客户端的异步请求的 action
 *     controller - 实现验证逻辑的 controller,即处理客户端的异步请求的 controller
 */
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
  
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
  
namespace MVC30.Models
{
    public class User
    {
        public int ID { get; set; }
          
        [DisplayName("名字")]
        [Required(ErrorMessage = "名字不能为空")]
        [Remote("CheckUserNameExists", "ValidationDemo", ErrorMessage = "名字已存在")]
        public string Name { get; set; }
  
        [DisplayName("密码")]
        [Required(ErrorMessage = "密码不能为空")]
        public string Password { get; set; }
  
        [DisplayName("确认密码")]
        [Required(ErrorMessage = "确认密码不能为空")]
        [Compare("Password", ErrorMessage="两次密码输入不一致")]
        public string ConfirmPassword { get; set; }
  
        public DateTime DateOfBirth { get; set; }
  
        // 请求时,允许此字段包含 HTML 标记
        [AllowHtml]
        public string Comment { get; set; }
    }
}

ValidationDemoController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
  
using MVC30.Models;
  
namespace MVC30.Controllers
{
    public class ValidationDemoController : Controller
    {
        // 用于演示客户端的远程 ajax 异步验证
        public ActionResult Validation_Remote()
        {
            var user = new User { ID = 1, Name = "webabcd", DateOfBirth = new DateTime(1980, 2, 14), Comment = "<b>mvp</b>" };
  
            return View(new User());
        }
  
        [HttpPost]
        public ActionResult Validation_Remote(User user)
        {
            return View(user);
        }
  
        // 用于处理客户端的异步请求,测试时请使用字符串“webabcd”
        [HttpGet]
        public ActionResult CheckUserNameExists(string name)
        {
            return Json(name != "webabcd", JsonRequestBehavior.AllowGet);
        }
    }
}

Validation_Remote.cshtml
@model MVC30.Models.User
             
@{
    ViewBag.Title = "Validation_Remote";
}
  
<h2>ClientValidation</h2>
  
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
  
@using (Html.BeginForm())
{
    <fieldset>
        <legend>User</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
            (测试方法:在文本框中输入“webabcd”)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}


3、Model 中使用更多的 Data Annotations 以及实现自定义的 Data Annotations 和自定义 jQuery 的相关逻辑
User.cs
/*
 * 如何使用更多的 Data Annotation
 *     1、在“Tools”中选择“Extension Manager”(安装 NuGet 后会有此选项)
 *     2、搜索“DataAnnotationsExtensions”,然后安装“DataAnnotationsExtensions.MVC3”项目
 *     3、之后就可以使用此项目所支持的多个新的 Data Annotation
 * 如何自定义 Data Annotation
 *     详见:IntegerAttribute.cs
 */
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
  
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
  
namespace MVC30.Models
{
    public class User
    {
        public int ID { get; set; }
          
        [DisplayName("名字")]
        [Required(ErrorMessage = "名字不能为空")]
        [Remote("CheckUserNameExists", "ValidationDemo", ErrorMessage = "名字已存在")]
        public string Name { get; set; }
  
        [DisplayName("密码")]
        [Required(ErrorMessage = "密码不能为空")]
        [Integer(ErrorMessage = "密码必须是整型")]
        public string Password { get; set; }
  
        [DisplayName("确认密码")]
        [Required(ErrorMessage = "确认密码不能为空")]
        [Compare("Password", ErrorMessage="两次密码输入不一致")]
        public string ConfirmPassword { get; set; }
  
        public DateTime DateOfBirth { get; set; }
  
        // 请求时,允许此字段包含 HTML 标记
        [AllowHtml]
        public string Comment { get; set; }
    }
}

IntegerAttribute.cs
/*
 * 自定义 Data Annotation,以实现与 jQuery 结合的客户端和服务端双重验证
 */
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
  
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using System.Web.Mvc;
  
namespace MVC30.Models
{
    // 继承 ValidationAttribute 抽象类,重写 IsValid() 方法,以实现服务端验证
    // 实现 IClientValidatable 接口的 GetClientValidationRules() 方法,以实现客户端验证
    public class IntegerAttribute : ValidationAttribute, IClientValidatable
    {
        // 服务端验证逻辑,判断输入是否为整型
        public override bool IsValid(object value)
        {
            var number = Convert.ToString(value);
            return Regex.IsMatch(number, @"^[0-9]+$");
        }
          
        // 客户端验证逻辑,需要结合客户端验证代码,详见 Validation_Custom.cshtml 文件
        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var rule = new ModelClientValidationRule
            {
                ErrorMessage = this.ErrorMessage,
  
                // ValidationType - 指定一个 key(字符串),该 key 用于关联服务端验证逻辑与客户端验证逻辑。注:这个 key 必须都是由小写字母组成
                ValidationType = "isinteger" 
            };
  
            // 向客户端验证代码传递参数
            rule.ValidationParameters.Add("param1", "value1");
            rule.ValidationParameters.Add("param2", "value2");
  
            yield return rule;
        }
    }
}

ValidationDemoController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
  
using MVC30.Models;
  
namespace MVC30.Controllers
{
    public class ValidationDemoController : Controller
    {
        // 用于演示如何使用更多的 Data Annotations 来实现服务端和客户端的双重验证,以及如何自定义 Data Annotations 来实现服务端和客户端的双重验证
        public ActionResult Validation_Custom()
        {
            var user = new User { ID = 1, Name = "webabcd", DateOfBirth = new DateTime(1980, 2, 14), Comment = "<b>mvp</b>" };
  
            return View(new User());
        }
  
        [HttpPost]
        public ActionResult Validation_Custom(User user)
        {
            return View(user);
        }
    }
}

Validation_Custom.cshtml
@model MVC30.Models.User
             
@{
    ViewBag.Title = "ClientValidation";
}
  
<h2>ClientValidation</h2>
  
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
  
<script type="text/javascript">
  
    // 客户端验证逻辑,判断输入是否为整型
    jQuery.validator.addMethod(
        'checkInteger',
        function (value, element) {
            var reg = new RegExp("^[0-9]+$");
            return (reg.test(value));
        }
    );
  
    // 将客户端验证逻辑通过 ValidationType 与服务端的相关验证逻辑结合起来
    jQuery.validator.unobtrusive.adapters.add(
        'isinteger', // ValidationType,必须全为小写
        ['param1', 'param2'], // 接收 ModelClientValidationRule 中的参数信息
        function (options) {
            options.rules['checkInteger'] = true; // 启用名为 checkInteger 的客户端验证逻辑
            options.messages['checkInteger'] = options.message; // 发生验证错误后的显示信息
            var param1 = options.params.param1; // ModelClientValidationRule 中的参数信息
            var param2 = options.params.param2; // ModelClientValidationRule 中的参数信息
            alert(param1 + " " + param2);
        }
    ); 
  
</script>
  
@using (Html.BeginForm())
{
    <fieldset>
        <legend>User</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
            (测试方法:在文本框中输入非整型的字符串)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Password)
            @Html.ValidationMessageFor(model => model.Password)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}


ASP.NET MVC 入门8、ModelState与数据验证 原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/08/1305962.html 阅读详情

相关推荐

深入理解ASP.NET Core MVC中的数据验证

本文深入探讨了ASP.NET Core MVC框架中的数据验证机制,通过应用验证属性如Required和Range到Product类的Name和Price属性,展示了如何简化模型验证过程。文章还介绍了如何创建自定义验证属性来满足特定的验证需求,以及如何处理ApiController标记的控制器中的验证。通过对代码示例的详细解读,本文为读者提供了在实际开发中运用数据验证技术的宝贵参考。

weixin_42610010的博客 517

asp.net 判断字符串是否是数字的,int的,整型的

#region 判断字符串是否是数字的      /// &lt;summary&gt;  /// 判断是否是数字  /// &lt;/summary&gt;  /// &lt;param name="str"&gt;字符串&lt;/param&gt;  /// &lt;returns&gt;bool&lt;/returns&gt;  public bool IsNumeric(string

☆╮123☆ 1933

Vivado FFT IP核配置与实战:FPGA信号处理硬件加速指南

快速傅里叶变换(FFT)是数字信号处理(DSP)中的核心算法,用于将时域信号转换到频域进行分析。其原理基于离散傅里叶变换(DFT),通过蝶形运算的分解与复用,大幅降低了计算复杂度。在工程实践中,软件实现的FFT难以满足高速实时处理的需求,因此硬件加速方案至关重要。FPGA凭借其并行架构和可定制性,成为实现高性能FFT的理想平台。通过集成专用的FFT IP核,如Vivado中的Pipelined Streaming I/O架构,可以构建流水线化的计算引擎,实现极低延迟和高吞吐量的连续数据流处理。这种硬件方案特

weixin_42536863的博客 647

MVC下的四种验证编程方式

ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定。总地来说,我们可以采用4种不同的编程模式来进行针对绑定参数的验证。在定义具体Action方法的时候,对已经成功绑定的参数实施手工验证无疑是一种最为直接的编程方式,接下来我们通过一个简单的实例来演示如何将参数验证逻辑实现在对应的Action方法中,并在没有通过验证的情况下将错误信息响应给客户端。

chengxuyuanlaow的博客 487

STM32F103C8T6+HX711实战:从零打造智能体重秤(附OLED显示与语音播报)

本文详细介绍了基于STM32F103C8T6微控制器和HX711称重模块,从零构建智能体重秤的完整实战教程。内容涵盖硬件选型、系统架构、驱动编写、数据滤波校准算法,并实现了OLED显示与语音播报功能。该项目是嵌入式学习的综合性实践,尤其适合作为毕业设计课题,帮助开发者掌握传感器应用、数据处理及人机交互等核心技能。

weixin_28285943的博客 517

斑马算法优化变分模态分解ZOA-VMD数字信号去噪(优化K值 alpha值)【含Matlab源码 4887期】

斑马算法优化变分模态分解ZOA-VMD数字信号去噪(优化K值 alpha值) 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 811

.NET MVC中的数据验证

一 概述   关于数据验证和数据注解,是任何软件系统不可小觑的必要模块,主要作用是为了保证数据安全性、防止漏洞注入和网络攻击。从数据验证的验证方式来说,我们一般分为客户端验证和服务端验证(或者两种方式相结合),本篇文章主要讲解基于ASP.NET MVC5中的服务端验证,主要包含数据验证特性来实现数据验证和数据注解。   使用的方法:数据验证特性使用起来非常方便,定义好Entit...

banyongzhan5405的博客 314

【原理图PCB专题】Cadence 17.4版本导出excel版本坐标文件

Cadence 17.4版本导出坐标文件往往都是txt格式,并且无标题、导出时间、导出设计工程多名称等信息。那么怎么样才能导出有带这些信息的excel版本并格式好看的坐标文件呢?

一点硬件 2763

Asp.net Mvc 数据验证

asp.net mvc中的数据验证分为两种: 1.属性级验证 2.模型级验证 大多数时候只需要属性级验证,

_风尘的博客 1494

ESP32设备驱动-TM1637-驱动4位7段数码管

TM1637是一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成了MCU数字接口、数据锁存、LED高压驱动、键盘扫描等功能。 TM1637使用DIP20/SOP20封装,主要适用于电磁炉、微波炉、小家电的显示驱动。

视觉与物联智能 2118

计算机视觉教程1-1:透视空间与透视变换

在生活中,透视现象很常见,其物理本质是光的直线传播。由于人眼与相机在捕获图像时均存在透视现象,因此计算机几何基于透视空间进行研究。本节介绍透视变换原理

FRIGIDWINTER的博客 3091

ASP.NET MVC 数据验证

本篇文章跟大家分享关于ASP.NET MVC的数据验证,主要内容如下: 1. 了解数据验证 2. 显式地添加验证 3. 显示验证结果 4. 使用元数据进行验证 5. 执行客户端验证 6. 避免对ORM对象的标注在重新编译时被覆盖掉了解数据验证在使用ASP.NET MVC框架进行开发时,什么时候会进行数据验证呢?首先在用户提交表单钱,需要对用户的输入进行验证,这个过程一般由程序

朱登凯的专栏 3136

YOLOP v2!YOLOv7结合YOLOP的多任务版本 更好、更快、更强

YOLOP v2!YOLOv7结合YOLOP的多任务版本 更好、更快、更强

jacke121的专栏 2705

ASP.NET MVC--数据验证

public QQNumberAttribute() : base(@"^\d{5,10}$") //不要忘了^$ {this . ErrorMessage = "{0}属性不是合法的QQ号,QQ号需要5-10位数字";//设定ErrorMessage的默认值。使用的人也可以覆盖这个值 } }手机号的正则表达式:@“^1(3[0-9]|4[57]|5[0-35-9]|7[01678]|8[0-9])\d{8}$”

不求上进的码农的博客 920

UG\NX二次开发 获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态

获取对象的层、颜色、隐藏状态、线宽、线型、高亮显示状态。

王牌飞行员_里海的博客 1982

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【.NET框架】—— ASP.NET MVC数据验证注解(三)

数据验证注解:通过在Models层,通过注解特性对模型属性,进行注解设置,来实现数据验证的功能。 主要命名空间:System.ComponentModel.DataAnnotations 1.1.ASP.NET MVC Required特性 Requierd特性: n 设置必填属性,验证是否填写内容 n 服务端Model属性添加[Required] n 前端提示错误信息 @Html.ValidationMessageFor() 示例代码: ①在Models层上引入System.ComponentMo...

gman344的博客 1024

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【ASP.NET MVC系列】浅谈数据注解和验证

【ASP.NET MVC系列】浅谈数据注解和验证 【01】浅谈Google Chrome浏览器(理论篇) 【02】浅谈Google Chrome浏览器(操作篇)(上) 【03】浅谈Google Chrome浏览器(操作篇)(下) 【04】浅谈ASP.NET框架 【05】浅谈ASP.NET MVC运行过程 【06】浅谈ASP.NET MVC ...

258

jre9下载 jdk9

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Asp.net MVC2学习笔记8-数据验证(前后台统一验证)

验证用户的输入在web系统中是肯定要经常用到的,比如说输入不能为空或者输入的字符要在一定的范围内等等。。大多数时候我们使用前台的 Javascript 来验证用户的输入,前面有篇文章已经给大家介绍了前台 javascript验证是不可靠的,所以大部分人在后台insert或者update的之前做了验证,这是比较好的,但是 Asp.net MVC 给我们提供了很多数据验证方法,今天就来介绍一个Model数据验证的方法,使用的命名空间是:System.ComponentModel.DataAnnotations,

体会技术牛人的高傲 1270

【MVC】ASP.NET MVC之数据验证

前端传到后端数据的不可信任性,DRY("Don't Repeat Yourself") 设计原则。MVC3.0出了后端数据验证特性,鼓励你只定义一次功能或行为,然后在应用程序中各处进行使用。这会大大减少需要编写的代码量,使你的代码不容易出错,更便于测试和维护。 System.ComponentModel.DataAnnotations命名空间提供定义 ASP.NET MVC 和 ASP.NET...

weixin_30950237的博客 161

ASP.NET MVC 结合EDMX 数据模型验证

这是我最近才解决的一个问题,在MVC3中添加的ADO.NET 实体验证模型。当然这是是客户要求,不太喜欢这个东西,每次映射数据库都会生成一大堆代码。。不过功能还是比较强大的,不用自己写数据访问代码。。是一个快速开发可以选择框架。。 OK。进入正题 ASP.NET MVC 结合EDMX 数据模型验证有二种方式: 第一种: 就是将数据库的表结构修改成 null    的类型。。然后

zl494805095的专栏 1549

ASP.NET MVC数据验证

关于ASP.NET MVC的验证,用起来很特别,因为MS的封装,使人理解起来很费解。也可能很多人都在Scott Guthrie等人写的一本《ASP.NET MVC 1.0》书中,见过NerdDinner项目中对Dinner对象修改和添加的时的数据验证。但有许多封装的地方,不知道是怎样的工作原理,今天研究了,拿出来给大家分享一下。 数据库还是上一篇blog中的库与表,同样的方法来创建news表的实...

weixin_30323961的博客 118
上一篇: AJAX与ASP.NET结合仿GridView增删改查功能
下一篇: LINQ(LINQ to SQL)之调用存储过程的添加、查询、更新和删除
wanglei_samrtfish
博客等级 码龄15年 38粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值