ASP.NET 团队和社区在 .NET 8 继续全力投入 Blazor,为它带来了非常多的新特性,特别是在服务端渲染(SSR)方面,一定程度解决之前 WASM 加载慢,Server 性能不理想等局限性,也跟原来的 MVC,Razor Pages 框架在底层完成了统一。

AntDesign Blazor 作为 Blazor 最受欢迎的开源组件库之一,自然也会继续佛系跟进。本篇主要介绍第一个在 AntDesign Blazor 上应用的 .NET 8 新特性—— CascadingModelBinder,我利用它实现了 ReuseTabs 自 2021 年发布两年后,一直未支持的 Query String 属性绑定。

ReuseTabs 是 AntDesign Blazor 在 2021 年 7 月增加的组件,也是 Blazor 目前唯一真正实现路由复用的组件。它只需在 App.razor 增加 RouteData 级联值,就可以在任何 Blazor 项目中独立使用(其文档上的例子就是在官方模板上使用的),不依赖菜单配置就能够主动识别路由,渲染页面组件,并保持每个 Tab 页面的状态切换不会丢失。不像其他组件库的实现,只能在他们指定的配套模板上才能使用…

它的实现原理也很简单,是通过级联的 RouteData 值,获取需要展示的组件类型以及要绑定页面组件的属性值,再动态渲染组件的。但是因为在 .NET 6 加入的 Query string 属性值绑定实现是在 RouteView 内部利用一个内部静态方法来解析 QueryString 并传给页面组件的,ReuseTabs 想要支持得把代码都抄一份。当时就觉得这样的设计很有局限(后来就懒得了)。

直到在前段时间 .NET 官方博客中发布的文章 ASP.NET Core 在 .NET 8 Preview 6 中的更新,里面提到了一个特性,级联 query string 值到 Blazor 组件,意思是不再让Query string 值绑定局限于页面组件了,我就像这下 ReuseTabs 缺失了两年的功能,有希望填补了。

于是就有了今天要介绍的内容。

为了寻找官方是怎么实现的,把 aspnetcore 仓库源码切换到 .NET 6 Preivew 6 的 tag 上,找到 RouteView 的源码在RouteView.cs 中的 RenderPageWithParameters 方法,就是用于渲染页面组件的。

于是追溯这个文件的历史记录,找到在这个支持服务端静态渲染表单的 PR#47716 加入了 CascadingModelBinder,这样就可以从 Http 请求中获取提交的 FormData 绑定到组件中标记了 SupplyParameterFromForm 特性的模型上。

接着,在PR #48554 中使 SupplyParameterFromQuery 也能够通过 CascadingModelBinder 传递了,然后把上文提到的 RouteView 中的内部类 QueryParameterValueSupplier 相关代码删掉了。

这简直正中眉心,马上我就把 RouteView 中的这段代码复制到 ReuseTabs 中了,PRhttps://github.com/ant-design-blazor/ant-design-blazor/pull/3377,完美!

最终效果:

开心之余,我寻思着就算是抄,也不能抄的不明不白吧,于是就顺便调查了一下 CascadingModelBinder 是怎么传递级联值的。简单一句就是 Blazor 创建了 CascadingModelBinder 组件和 CascadingModelBindingProvider 提供者来抽象和统一了级联传值方法。没想到官方博客中平淡的两句话介绍背后有这么大的改动。详情请关注我后面文章,另作介绍。

跟进 .NET 8 Blazor 之 ReuseTabs 支持 Query 属性绑定的更多相关文章

  1. IE6-8支持css3属性

    方法一.让IE6-8支持css3属性 <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shi ...

  2. 让IE6/IE7/IE8浏览器支持CSS3属性

    让IE6/IE7/IE8浏览器支持CSS3属性 一.下载 您可以狠狠地点击这里:ie-css3.htc,这个玩意儿是让IE浏览器支持CSS3表现的关键东东. 二.上面的是什么东西 首先说说.htc文件 ...

  3. 解决ie6下不支持fix属性,模拟固定定位

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  4. PowerDesigner 16.5对SQL Server 2012 生成数据库时"不支持扩展属性"问题

    团队合作设计一套系统数据模型,创建了PDM后,Table.View.Store Procedure等都创建好了,且创建了多个Schema方便管理这些数据库对象,但Table.view.Column等对 ...

  5. 在IE8等不支持placeholder属性的浏览器中模拟placeholder效果

    placeholder是一个很有用的属性,可以提示用户在input框中输入正确的内容,但是IE8以及IE8一下的浏览器不支持该属性,我们可以使用js来模拟相似的效果.下面直接上代码: <!doc ...

  6. apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定

    摘要:apache支持中文域名绑定,apache支持中文域名绑定,教你怎样让apache支持中文域名绑定,根据本人实际经验,叫你如何让apache支持中文域名绑定,绝对管用的让apache支持中文域名 ...

  7. 让IE6IE7IE8支持CSS3属性的8种方法介绍

    我们都知道,IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现状,他们总是尽量使用一些手段使IE浏览器也能支持CSS3属性,我觉得这些都是很有意义,很有价值的工作,可以推动整个技术领域的 ...

  8. IE浏览器部分版本不支持background-siza属性问题

    background-size是CSS3新增的属性,但是IE8以下还是不支持,可以通过滤镜来实现这样的一个效果 background-size:contain; // 缩小图片来适应元素的尺寸(保持像 ...

  9. js错误:对象不支持此属性或方法

    对象不支持此属性或方法 错误原因: 可能是js的文件名和另外一个文件重复. 也有可能是js里的function和另外一个function名字重复. 也有可能是js里的function和页面的某一元素重 ...

  10. 对象不支持“attachEvent”属性或方法的解决办法

    有些脚本在IE11下执行会报错误: 对象不支持“attachEvent”属性或方法 解决办法 解决办法:把attachEvent改为addEventListener即可

随机推荐

  1. 如何使用jsDelivr+Github 实现免费CDN加速?

    目录 序言 1 cdn简介 2 cdn请求分发原理 3 jsDelivr简介 4.jsDelivr 的简单使用 5 jsDelivr + Github 的具体实现 5.1 新建Github仓库 5.2 ...

  2. .NET Core 离线生成 Tron 波场私钥和地址笔记

    NuGet 引入依赖库 PM> Install-Package Tron.Wallet.Net 随机生成私钥和对应的地址 using Tron.Wallet.Net; namespace Con ...

  3. 字符串处理------Brute Force与KMP

    一,字符串的简单介绍 例:POJ1488  http://poj.org/problem?id=1488 题意:替换文本中的双引号: #include <iostream> #includ ...

  4. 2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共进行m次操作,二狗每次操作选择一个数k,

    2022-12-20:二狗买了一些小兵玩具,和大胖一起玩, 一共有n个小兵,这n个小兵拍成一列, 第i个小兵战斗力为hi,然后他们两个开始对小兵进行排列, 一共进行m次操作,二狗每次操作选择一个数k, ...

  5. 2022-04-26:给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false。 从点 (x

    2022-04-26:给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false. 从点 (x ...

  6. Django4全栈进阶之路10 url路由设置

    在 Django 4 中,可以在主路由文件中设置和管理子路由.通常,我们会为每个应用程序创建一个子路由文件,以便更好地组织代码和管理路由. 以下是 Django 4 中设置主路由和子路由的示例: 首先 ...

  7. k8s资源对象(二)

    Configmap和Secret资源介绍 secret和configmap资源都是通过挂载的方式将对应数据挂载到容器内部环境中去使用,两者的使用没有太多的不同 ,configmap资源通常用于为pod ...

  8. 详解JS的Object.create()

    Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__. 语法 Object.create(proto[, propertiesObject]) Obj ...

  9. adb server version (31) doesn't match this client (41); killing...

    使用用 adb devices 提示如下错误 C:\Users\Lenovo>adb devices adb server version (31) doesn't match this cli ...

  10. Hugging News #0526: Hugging Cast 发布第一期、邀请来认领自己的论文啦!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...