Blazor University (33)表单 —— EditContext、FieldIdentifiers

原文链接:https://blazor-university.com/forms/editcontext-fieldidentifiers-and-fieldstate/

EditContext、FieldIdentifiers 和 FieldState

请注意,对于那些希望了解 Blazor 如何“在后台”工作的人来说,这是一个高级主题。无需了解此信息即可正常使用 Blazor - 但我觉得了解内部信息可能是有益的。

让我们从描述 Blazor 如何维护表单数据的元状态的 UML 图开始。

92f9dd20059c252e5524592ca9ddd0cf.png

EditContext

每当 EditForm.Model 更改(表单中正在修改的对象)时,都会执行 EditForm.OnParametersSet 并创建一个新的 EditContext 实例。EditForm 组件将此 EditContext 声明为级联值[1],以便表单中的任何组件都可以访问它。

EditContext 是当前正在编辑的对象的表单元数据持有者。在表单中编辑对象(例如 Person)时,Blazor 需要了解有关该对象的其他信息,以便提供更丰富的用户体验。Blazor 持有的其他信息告诉我们:

  • 如果模型的特定属性已被手动更改。

  • 哪些模型属性有验证错误,这些错误是什么。

显然,正在编辑的模型类应该只代表我们特定的业务需求,因此让我们的模型类实现这些额外的用户界面状态信息将是一个关注点冲突——因此 Blazor 将这些额外信息本身存储在 EditContext 中。这就是 EditForm 在其 Model 更改时创建一个新的 EditContext 的原因,因为如果 Model 更改,则 EditContext 中保存的信息不再相关。

FieldIdentifier

FieldIdentifier 的目的是为对象的特定属性提供标识。它与 System.Reflection.PropertyInfo 不同,因为它标识特定对象实例的属性,而反射标识类的属性。

给定一个具有名为 PostalCode 的属性的 Address 类,我们可以预期以下相等规则:

是否相等?
// 反射:不同实例上的相同属性
address1.GetProperty(“邮政编码”);
address2.GetProperty(“邮政编码”);
// FieldIdentifier:同一个实例的同一个属性
new FieldIdentifier(address1, “PostalCode”);
new FieldIdentifier(address1, “PostalCode”);
// FieldIdentifier:不同实例上的相同属性
new FieldIdentifier(address1, “PostalCode”);

new FieldIdentifier(address2, “PostalCode”);

当 UI 状态(例如验证错误)需要与输入值相关联时,我们需要某种方式来识别该状态与哪些输入数据相关。在以前的 Web 技术中,通常使用字符串来标识单个输入,以下是一些示例:

  • EmailAddress

  • HomeAddress.PostalCode

  • WorkAddress.PostalCode

一旦用户界面变得复杂,这些路径可能会非常复杂。

  • Contacts[0].Name

  • Contacts[0].ContactDetails[0].TelephoneNumber

  • Contacts[0].ContactDetails[0].EmailAddress

  • Contacts[9].ContactDetails[3].TelephoneNumber

Blazor 简化了此过程,因为它的设计方式允许它始终在同一进程中处理对象和属性标识。这使我们能够通过存储两条简单的信息来识别任何对象的任何属性。

1.直接引用对象本身。2.该对象的属性名称。

标识现在很简单,并且(与字符串路径不同)永远不必更改以考虑数据的更改,例如从数组中删除项目。例如,在字符串路径方法中,如果要删除列表中的第一个联系人,则需要将 Contacts[9].ContactDetails[3].TelephoneNumber 更改为 Contacts[8].ContactDetails[3].TelephoneNumber。Blazor 的 ObjectReference/PropertyName 方法避免了这种复杂性。

即使我们编写自己的自定义验证器与服务器对话以确定有效性(例如唯一值的可用性,例如 EmailAddress),我们的 Blazor 验证器也会获得一个 FieldIdentifier 的实例,然后可以关联来自服务器调用的结果直接使用正确对象实例的正确属性。

FieldState

FieldState 类包含有关任何对象属性的附加信息。EditContext 类具有 Dictionary<FieldIdentifier, FieldState> 类型的私有属性 - 这使 Blazor 可以将其附加状态存储在扁平列表中以便快速访问。

给定以下模型

protected override OnInitialized()
{var country1 = new Country{Code = "GB",Name = "Great Britain"};var address1 = new Address{Line1 = "The Mansion",Line2 = "Bletchley Park",Line3 = "Sherwood Drive",Town = "Bletchley",Area = "Milton Keynes",PostalCode = "MK3 6EB",Country = country1};var person1 = new Person{Name = "My name",Age = 12,HomeAddress = address1,TelephoneNumber = "+44 (0) 1908 64004"};
}

我们希望看到如下的字段标识符:

c2cdee397ead2686e1d402be2a92836a.png

注意: 条目仅在需要时添加到字典中。

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

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

相关文章

团队项目开发篇章8

例会时间&#xff1a;2016.11.3 整理&#xff1a;姬索肇 例会照片 每个人的工作 任务分配 我们今天与王鹿鸣学长和李云涛学长针对团队开发过程中遇到的问题进行了讨论&#xff0c;非常感谢学长们的热心帮助&#xff0c;同时我们也被他们强大的编程能力所折服~ 在这里为学长们点…

【地理信息系统GIS】教案(七章全)第一章:地理信息系统概述

文章目录 第一节 GIS基本概念第二节 GIS的组成第三节 GIS的功能第四节 GIS的发展第一节 GIS基本概念 1.1 GIS基本概念 1、信息 是用文字、数字、符号、语言、图象、图形等介质来表达事件、事物或现象等的内容、数量和特征,从而向人们(或系统)提供关于现实世界新的事实和知…

表达式的动态解析和计算,Flee用起来真香

前言在很多项目中经常会出现需要动态解析表达式和计算的场景&#xff0c;比如一些自动审核规则&#xff0c;或者是一些变量的值通过维护的公式在运行过程中动态算出&#xff1b;由于场景需求&#xff0c;都需要比较灵活的配置对应的表达式&#xff0c;然后希望在需要的时候能根…

C语言九十五之实现经典的反转数组(通过指针或数组下标操作)

✅作者简介&#xff1a;大家好我是码玛莎拉蒂&#xff0c;CSDN博客专家&#x1f947;&#x1f947;&#x1f947; &#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;C语言试题200例 &#x1f4ac;推荐一款模拟面试、刷题神器&#x1f449; 点击跳转…

Linux下使用shell实现上传linux下某个目录下所有文件到ftp

首先我们需要搞清楚单个文件怎么上传&#xff0c;把这个单文件上传到ftp上的实现命名为一个:upload_to_ftp_command.sh 之后&#xff0c;需要弄清楚怎么实现遍历一个目录下的所有文件的&#xff0c;把这个遍历某个目录下的文件实现命名为&#xff1a;foeach_directory_and_uplo…

[转]Mysql数据库开发的36条原则

前言 这些原则都是经历过实战总结而成 每一条原则背后都是血淋淋的教训 这些原则主要是针对数据库开发人员&#xff0c;在开发过程中务必注意 总是在灾难发生后&#xff0c;才想起容灾的重要性&#xff1b; 总是在吃过亏以后&#xff0c;才记得曾有人提醒过。 一、核心原则…

大话领域驱动设计——表示层及其他

概述表示层又称用户界面层&#xff0c;包含应用程序的页面、组件等UI元素。服务层提供项目的HTTP API接口&#xff0c;包含MVC Controller和相关组件。ABP框架虽然在表示层提供了不少组件&#xff0c;但是这些和DDD本身没有多少关系。而且随着前后端分离架构的流行&#xff0c;…

Windows10家庭中文版没有本地策略选项完美解决方案

Win+R,在运行中输入:secpol.msc,查看安全设置是否打开,如下图所示。 组策略对于优化和维护Windows系统来说十分重要。众所周知,Windows 10家庭版中并不包含组策略,对于使用家庭版Windows的朋友来说,十分不方便。 通常情况下,如果策略组没有打开的话,在安装CAD等软件时…

【ArcGIS风暴】栅格计算器(Raster Calculator)运算出现错误问题及解决方案汇总

栅格计算器(Raster Calculator) 是一种空间分析函数工具,可以输入地图代数表达式,使用运算符和函数来做数学计算,建立选择查询,或键入地图代数语法。只有熟练的运用并记忆一些常用的公式,才能很好的运用栅格计算器。在使用的过程中,容易出现这样那样的问题,本文就把栅…

为 ServiceCollection 实现装饰器模式

为 ServiceCollection 实现装饰器模式Intro在二十四种设计模式中&#xff0c;有一个模式叫做装饰器模式一般用来动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更为灵活&#xff0c;有更好的扩展性&#xff0c;我们也可以借助 D…

手把手教你启用Win10的Linux子系统 Ubuntu

1、打开“开发者选项” 2、启用“执行 Linux 程序的windows 子系统” 3、应用商店下载安装Ubuntu 附&#xff1a;ubuntu的一些命令及查看已安装软件包的命令 // 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat…

【地理信息系统GIS】教案(七章全)第五章:空间数据查询与空间分析

目录 第一节 空间数据查询第二节 缓冲区分析第三节 叠置分析第四节 网络分析第五节 DEM建立及分析第一节 空间数据查询 1.1 空间数据查询 1、空间数据查询的含义 从空间数据库中找出所有满足属性约束条件和空间约束条件的地理对象。 空间数据查询的一般过程 2、空间数据查询…

[转]5分钟实现Android中更换头像功能

5分钟实现Android中更换头像功能 写在前面&#xff1a; 更换头像这个功能在用户界面几乎是100%出现的。通过拍摄照片或者调用图库中的图片&#xff0c;并且进行剪裁&#xff0c;来进行头像的设置。 功能相关截图如下&#xff1a; 下面我们直接看看完整吧&#xff1a; public cl…

Excel VBA窗体上打印系统时间print now出错原因及解决方案

如图所示,需要在窗体上显示当前系统时间: 首先,我们看一下now函数的原型: Now 函数   语法:Now   说明:返回一个 Variant (Date),根据计算机系统设置的日期和时间来指定日期和时间。   示例: Private Sub CommandButton1_Click()Dim a As Varianta = NowMsgBox…

(第九周)团队项目14

项目名&#xff1a;食物链教学工具 组名&#xff1a;奋斗吧兄弟 组长&#xff1a;黄兴 组员&#xff1a;李俞寰、杜桥、栾骄阳、王东涵 代码地址&#xff1a;HTTPS: https://git.coding.net/li_yuhuan/FoodChain.git SSH: gitgit.coding.net:li_yuhuan/FoodChain.git SCRUM会议…

为什么 C# 访问 null 字段会抛异常?

一&#xff1a;背景 1. 一个有趣的话题最近在看 硬件异常 相关知识&#xff0c;发现一个有意思的空引用异常问题&#xff0c;拿出来和大家分享一下&#xff0c;为了方便讲述&#xff0c;先上一段有问题的代码。namespace ConsoleApp2 {internal class Program{static Person pe…

C语言试题一百之输入某年某月某日,判断这一天是这一年的第几天

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 1、题目 题目:输入某年某月某日,判断这一天是这一年的第几天? 分析: 以 3 月 5 日为例,应该先把…

[转]Java学习路线图(完整详细2019版)

一门永不过时的编程语言——Java 软件开发。 Java编程语言占比&#xff1a; 据官方数据统计&#xff0c;在全球编程语言工程师的数量上&#xff0c;Java编程语言以1000万的程序员数量位居首位。 而且很多软件的开发都离不开Java编程&#xff0c;因此其程序员的数量最多。而在…

【CASS精品教程】Win7+CAD2008+CASS9.1(含CASS3D)完美安装教程(附完整软件安装包下载)

本文讲解win764位系统上安装CAD2008+CASS9.1(含CASS3D)免费版安装,文末附完整软件下载地址,亲测可用!!! 文章目录 1. CAD2008安装2. CASS9.1安装3. 软件下载地址1. CAD2008安装 双击安装包中的Setup.exe,开始安装。 点击【安装产品】。

(十一)Jmeter另一种调试工具 HTTP Mirror Server

之前我介绍过Jmeter的一种调试工具Debug Sampler&#xff0c;它可以输出Jmeter的变量、属性甚至是系统属性而不用发送真实的请求到服务器。既然这样&#xff0c;那么HTTP Mirror Server又是做什么用的呢&#xff1f; 一、HTTP Mirror Server的作用&#xff1a; 它可以在本地临…