Blazor University (30)表单 —— 从 InputBase 派生

原文链接:https://blazor-university.com/forms/descending-from-inputbase/

从 InputBase 派生

源代码[1]

InputBase<T> 组件是各种 Blazor 输入控件所继承的抽象类。这个类在标准 HTML <input> 元素的基础上增加了额外的功能,比如验证——我们稍后会介绍。因此,如果我们打算将它们用作用户输入,建议我们从这个基类中继承组件。

实现 InputBase<T> 仅需要实现一个抽象方法和一个可选的虚拟方法。

InputBase<T> 是一个泛型类,它具有名为 ValueT 类型属性。由于 Web 浏览器使用字符串值,因此该组件需要一种将 T 类型的值与字符串相互转换的方法。

protected abstract bool TryParseValueFromString(string value, out T result, out string validationErrorMessage);

TryParseValueFromString 是一个抽象方法,为了将字符串值从 HTML <input> 元素(或其他使用字符串的源)转换为目标类型 T,应重写该方法。如果无法转换,则应设置 validationErrorMessage 为合适的消息以指示转换失败。这用于提供验证错误消息以及视觉无效状态,以便用户知道设置值的尝试失败。

protected virtual string FormatValueAsString(T value)

FormatValueAsString 是与 TryParseValueFromString 相对的。如果简单的 Value.ToString() 不足以将 T 的值转换回浏览器 UI 层,则应重写此方法以正确执行任务。

创建 InputColor 组件

首先我们需要创建一个 InputColor.razor 文件。在该文件中,我们需要将 InputBase<Color> 指定为基类,并添加我们希望在 HTML 中呈现的标记。

@using System.Drawing
@using System.Text.RegularExpressions
@inherits InputBase<Color><input type="color" @attributes=AdditionalAttributes class=@CssClass @bind=CurrentValueAsString/>

Color 类添加了 System.Drawing,并添加了 System.Text.RegularExpressions 用于将十六进制代码的输入解析为 Color 值。

我们要做的第一件事是实现 FormatValueAsString。为此,我们只需将 R、G 和 B 值格式化为 2 位十六进制值。

protected override string FormatValueAsString(Color value)=> $"#{value.R:x2}{value.G:x2}{value.B:x2}";

要将十六进制字符串转换回颜色,我们首先需要将 2 个字符的十六进制值转换为字节。

byte HexStringToByte(string hex)
{const string HexChars = "0123456789abcdef";hex = hex.ToLowerInvariant();int result = (HexChars.IndexOf(hex[0]) * 16) + HexChars.IndexOf(hex[1]);return (byte)result;
}

接下来我们需要实现 TryParseValueAsString

static Regex Regex = new Regex("^#([0-9a-f]{2}){3}$", RegexOptions.Compiled | RegexOptions.IgnoreCase);protected override bool TryParseValueFromString(string value, out Color result, out string validationErrorMessage)
{Match match = Regex.Match(value);if (!match.Success){validationErrorMessage = "Not a valid color code";result = Color.Red;return false;}byte r = HexStringToByte(match.Groups[1].Captures[0].Value);byte g = HexStringToByte(match.Groups[1].Captures[1].Value);byte b = HexStringToByte(match.Groups[1].Captures[2].Value);validationErrorMessage = null;result = Color.FromArgb(r, g, b);return true;
}

该代码使用正则表达式来确保该值是 6 个十六进制字符格式的字符串,前面有一个 # 字符。它捕获三组 2 位十六进制字符,并使用我们的 HexStringToByte 方法将它们转换为字节。最后,使用这些 RGB 值创建颜色。

我们应该给组件添加一个参数,允许它的使用者指定一个自定义错误消息,以便在传递的值无效时使用。添加 [Parameter] 属性。我们可以随意调用它,但 ParsingErrorMessage 是 Blazor 中使用的标准名称。

[Parameter]
public string ParsingErrorMessage { get; set; }

然后更改在 TryParseValueFromString 方法中设置 validationErrorMessage 的代码,以使用该参数而不是硬编码的错误消息。

if (!match.Success)
{validationErrorMessage = ParsingErrorMessage;result = Color.Red;return false;
}

为了便于将颜色显示为文本,让我们重构 FormatValueAsString 方法以使用静态方法,这样我们就可以独立于 InputColor 的任何实例使用该静态方法。

public static string ColorToString(Color value)=> $"#{value.R:x2}{value.G:x2}{value.B:x2}";protected override string FormatValueAsString(Color value)=> ColorToString(value);

我们的整个组件现在应该如下所示:

@using System.Drawing
@using System.Text.RegularExpressions
@inherits InputBase<Color><input type="color" @attributes=AdditionalAttributes class=@CssClass @bind=CurrentValueAsString/>@code {[Parameter] public string ParsingErrorMessage { get; set; }public static string ColorToString(Color value)=> $"#{value.R:x2}{value.G:x2}{value.B:x2}";protected override string FormatValueAsString(Color value)=> ColorToString(value);static Regex Regex = new Regex("^#([0-9a-f]{2}){3}$", RegexOptions.Compiled | RegexOptions.IgnoreCase);protected override bool TryParseValueFromString(string value, out Color result, out string validationErrorMessage){Match match = Regex.Match(value);if (!match.Success){validationErrorMessage = ParsingErrorMessage;result = Color.Red;return false;}byte r = HexStringToByte(match.Groups[1].Captures[0].Value);byte g = HexStringToByte(match.Groups[1].Captures[1].Value);byte b = HexStringToByte(match.Groups[1].Captures[2].Value);validationErrorMessage = null;result = Color.FromArgb(r, g, b);return true;}byte HexStringToByte(string hex){const string HexChars = "0123456789abcdef";hex = hex.ToLowerInvariant();int result = (HexChars.IndexOf(hex[0]) * 16) + HexChars.IndexOf(hex[1]);return (byte)result;}
}

InputColor 示例

我们将制作一个简单的页面,让用户选择个人最喜欢的颜色。

@page "/"
@using System.Drawing<EditForm Model=CurrentPerson><InputColor @bind-Value=CurrentPerson.FavoriteColor/>
</EditForm>Favorite colour is @CurrentPerson.FavoriteColor
<div style="width:100px;height:100px;background-color:@ColorAsHex"/>@code {Person CurrentPerson = new Person{FavoriteColor = Color.Green};string ColorAsHex => InputColor.ColorToString(CurrentPerson.FavoriteColor);class Person{public Color FavoriteColor { get; set; }}
}
  • 第 19-22 行

    创建一个我们的 EditForm 将绑定到的类。

  • 第 12-15 行

    创建此类的一个实例。

  • 第 17 行

    使用我们的静态 InputColor.ColorToString 将所选颜色转换为 Web 十六进制颜色字符串。

  • 第 9 行

    创建具有内联样式的 <div> 元素,该元素将所选颜色显示为实心框。

  • 第 4 行

    创建 EditForm,其模型绑定到我们页面的 Person

  • 第 5 行

    使用我们的 InputColor 组件,该组件将呈现一个带有 type=colorHTML <input> 元素,供用户交互。

2361f0b3732644f0849e821c5bcf7a9c.gif

参考资料

[1]

源代码: https://github.com/mrpmorris/blazor-university/tree/master/src/Forms/InheritingFromInputBase

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.菜鸟教你一步一步开发 web service 之 axis 服务端创建

转自&#xff1a;https://blog.csdn.net/shfqbluestone/article/details/37610601 第一步&#xff0c;新建一个工程&#xff0c;如图&#xff1a; 选 Java 写一个工程名&#xff0c;选择好工程路径&#xff0c;点下一步 选择 webServices &#xff0c;在右边的 version 中选择 …

C语言试题七十二之请编写函数判断三角形的类型,并输出其面积和类型。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

ArcGIS实验教程——实验三十四:ArcGIS地统计分析全解(直方图、正态QQ图、趋势分析、voronoi图、半变异函数、协方差云)

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 文章目录 一、地统计分析的基本原理二、地统计分析的工作流程三、探索性空间数据分析工具1. 直方图2. QQ分布图3. 趋势分析4. Voronoi图5. 半变异函数与协方差云6. 交叉协方差云四、空间插值一、地…

四则运算

四则运算的生成代码&#xff08;C语言&#xff09; 学生&#xff1a;徐克 夏嘉晖 1 #include<stdio.h> 2 #include<stdlib.h> 3 main() 4 { 5 int a[50]; 6 int b[50]; 7 int num,count,i; 8 printf("1.加法\n"); 9 printf("2.减法…

用python计算圆周率

一、算法 马青公式&#xff1a;马青公式由英国天文学教授约翰马青(John Machin &#xff0c;1686 –1751)于1706年发现。马青公式每计算一项可以得到1.4位的十进制精度。因为它的计算过程中被乘数和被除数都不大于长整数&#xff0c;所以可以很容易地在计算机上编程实现。 二、…

六、数组及其操作《2022 solidity8.+ 版本教程到实战》

一、数组 在 solidity 中&#xff0c;数组分为定长数组和动态数据&#xff0c;这两者的定义上跟 golang 很相似&#xff1b;其定长数组在创建好后不能设置超过数组长度的值&#xff0c;也就是不能push&#xff1b;而动态数组允许 push&#xff0c;还有一点很有意思的是&#x…

【Pix4d精品教程】垂直摄影空三加密生成DOM和DSM,并按10m间距提取高程点,生成等高线

在航测项目中,通常使用pix4d软件跑空三,生成数字正射影像DOM和数字表面模型DSM,当然还有点云数据。那么,在此基础之上,怎样根据航测要求,生成等间距5m或者10m的高程点和等高线呢,如上图所示?本文就来借助ArcGIS软件完成此波操作。 文章目录 一、Pix4d生成DOM和DSM二、A…

C语言试题七十三之请编写函数求两个数的最大公约数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

介绍一款python类型检查工具pyright

介绍 近日&#xff0c;微软在 Github 上开源了一个 Python 静态类型检查工具&#xff1a;pyright &#xff0c;引起了社区内的多方关注。 微软在开源项目上的参与力度是越来越大了&#xff0c;不说收购 Github 这种大的战略野心&#xff0c;只说它家开源的 VS Code 编辑器&am…

python使用localhost链接mysql出错及解决办法

在命令行下运行如下&#xff1a; import MySQLdb connMySQLdb.connect(hostlocalhost,userroot,passwdxxxx,dbtest1) xxxx是实际的密码。 但是运行上面代码时出现错误&#xff1a; Cant connect to local MySQL server... 但是&#xff0c;如果把localhost修改为127.0.0.1即可&…

使用 POST 向 ASP.NET Core 传递数据时的长度限制与解决方案

使用 HTTP 协议上传文件的标准做法是&#xff1a;使用 multipart/form-data 。但有时为了实现简单且要上传的文件不会太大&#xff0c;仍然会采用 application/x-www-form-urlencoded 上传文件&#xff0c;这就需要在上传前对二进制文件进行编码&#xff0c;比如使用 Base64 。…

Eclipse利用Maven2搭建SpringMVC框架的Web工程

一、准备工作&#xff1a; 下载apache-maven--> 配置Maven_home -->下载Eclipse Maven插件 二、新建工程&#xff1a; 选择新建Maven Project archetype选择webapp-->输入group ID &#xff08;src下包名&#xff09;和Artifact ID (工程名) 新建Maven工程目录如上图…

【ArcGIS风暴】ArcGIS10.6获取栅格影像边界范围的三种方法案例详解

基于ArcGIS平台有多种办法可以提取栅格影像边界,常见的方法有3种: 栅格范围(Raster Domain)栅格转面(Raster to Polygon)创建轮廓(BuildFootprints)/构建边界(BuildBoundary)文章目录 1. 栅格范围(Raster Domain)2. 栅格转面(Raster to Polygon)3. 创建轮廓(Bui…

七、结构体《2022 solidity8.+ 版本教程到实战》

结构体 结构体是一种可以自行定义的数据类型&#xff0c;其结构体内是复合的数据类型结构&#xff0c;当单一数据类型不能满足时可以使用创建所需结构体。 结构体定义使用 struct&#xff0c;例如以下示例&#xff1a; struct Human{uint age;string name;uint height;}以上…

微服务落地,我们在考虑什么?

原创&#xff1a; 李宁 博云技术社区 导读 微服务已经成为过去几年软件架构设计的“事实标准”&#xff0c;大多数企业在推动内部数字化转型的过程中&#xff0c;服务软件系统开始由单一或者SOA服务向微服务转型。那么转型过程需要遵循哪些原则呢&#xff1f;本文结合过往博云…

IDEA中使用数据库可视化操作工具

文章目录 1.入门介绍2. 没有数据库驱动3. 准备&测试连接3.1测试报错 4.连接5.编写SQL语句 1.入门介绍 在IDEA的专业版的右侧工具栏应该会有DataBase按钮如果没有的同学可以这样操作(必须是IDEA专业版) 新建数据库 2. 没有数据库驱动 如果提示: missing driver files ,…

WPF效果第一百九十篇之再耍ListBox

前面一篇效果基于Expander和ListBox实现了一下所需要的效果;今天再次实现点底部不一样的效果;最终实现的效果:1、ItemContainerStyle我是比较简单粗暴直接分了二行:ListBoxCanvas实现:<ControlTemplate TargetType"{x:Type ListBoxItem}"><Grid Background&…

C语言试题七十四之请编写函数求两个数的最小公倍数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

Rabbitmq~对Vhost的配置

rabbitmq里有一些概念我们要清楚&#xff0c;如vhost,channel,exchange,queue等&#xff0c;而前段时间在部署rabbitmq环境时启用了虚拟主机vhost&#xff0c;感觉他主要是起到了消息隔离的作用,下面分别再说一下它们的知识。 VHost vhost去做第一层的区分&#xff0c;虚拟主机…

【无人机驾照】无人机驾驶员考试题库选择题1060道(带答案)

001.无人机的英文缩写是 A. UVS B. UAS C. UAV 答案:C. 002.轻型无人机,是指空机质量 A. 小于7kg B. 大于7kg,小于116kg C. 大于116kg,小于5700kg 答案:B. 003近程无人机活动半径在 A. 小于15km B. 15~50km C. 200~800km 答案:B. 004任务高度一般在0~100m之间的无人…