- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
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 中了,PR https://github.com/ant-design-blazor/ant-design-blazor/pull/3377 ,完美! 。
最终效果:
开心之余,我寻思着就算是抄,也不能抄的不明不白吧,于是就顺便调查了一下 CascadingModelBinder 是怎么传递级联值的。简单一句就是 Blazor 创建了 CascadingModelBinder 组件和 CascadingModelBindingProvider 提供者来抽象和统一了级联传值方法。没想到官方博客中平淡的两句话介绍背后有这么大的改动。详情请关注我后面文章,另作介绍.
最后此篇关于跟进.NET8Blazor之ReuseTabs支持Query属性绑定的文章就讲到这里了,如果你想了解更多关于跟进.NET8Blazor之ReuseTabs支持Query属性绑定的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
ASP.NET 团队和社区在 .NET 8 继续全力投入 Blazor,为它带来了非常多的新特性,特别是在服务端渲染(SSR)方面,一定程度解决之前 WASM 加载慢,Server 性能不理想等局限
我正在尝试执行一个小程序,但无法真正完全理解它。在某些地方,我认为它的作用是错误的,但我知道 where =[] 如果有人能指出我正确的方向,我将不胜感激。 import java.util.*; p
感谢您对我上一篇文章的帮助,@AndyE,您的解决方案效果很好。 现在我的后续行动,相同的想法,不同的功能...我尝试实现您之前的解决方案,但无法让它正常工作...: $(document).keyp
我有一个看起来像这样的列表: ('string ', 'time', 'SPY', 0, 0, 131.63, 100), ('sting ', 'time', 'SPY', 0, 0, 131.63
多年来,我们一直在使用 BoundsChecker for Visual C++ 6(我认为它也是 BoundsChecker 5 或 6)。我们已经升级到 VS2008(终于!),现在需要跟进过时的
这是这个问题的后续:Why does a division result differ based on the cast type? 快速总结: byte b1 = (byte)(64 / 0.8f
再次免责声明:我是 Clojure 新手。感谢您的帮助。 我之前的问题 ( Clojure's defrecord - how to use it? ) 产生了一个有效的数据结构和方法:https:/
这是 MySQL count / track streaks or consecutive dates 的后续问题 马特为我之前的问题提供的解决方案效果很好,但现在我遇到了一个问题,因为我正在处理 1
关于问题Multiple delegates per one object?其中一个答案提出了有趣的解决方案(至少对于我天真的眼睛来说):创建一个“委托(delegate)拆分器”,允许一个对象(在本
首先,请阅读我认为我修复了它的旧帖子。 (没时间可以跳过) Firefox interacts with my timers somehow ?!?! This is crazy ^^ 对于那些不想阅
您好,提前谢谢您。这是来自以下线程的跟进问题(不确定我是否应该在那里发布或开始一个新线程......: CSRF token missing or incorrect even though I ha
我之前问过一个问题,根据用户点击这篇文章的哪个链接来填充页面,可以在这里找到: How to populate 1 php page differently depending on link cli
跟进 https://stackoverflow.com/a/3448189 ,实际显示密码屏幕的最佳方式是什么? 我的第一次尝试是使用 LockActivity 启动 SubActivity: //
这是对 How to interpret ggplot2::stat_density2d 的直接跟进. bins已作为参数重新添加 see this thread和 corresponding git
这是 Why is my OpenMP implementation slower than a single threaded implementation? 的后续内容. 我坚持提供的答案,并使用
跟进我之前的问题。 谁能解释为什么下面的代码编译没有任何错误: typedef array MethodArray; typedef array ParameterArray; ParameterAr
按照@AlexWein 在this question 中的建议看着 ProGuard Troubleshooting ,我在 SherlockFragment 中有以下内容: Class c = Cl
这是我之前问过的一个关于计算直手的问题的后续问题......不完全一样......这是读牌的方法 - 它有效 - 但有没有更好的方法 - 做这在 C 中使用控制台输入 ... void read_ca
这是 Previous Question 的跟进 它变得非常复杂,所以我开始一个新线程来使我的观点更清楚。(不想删除以前的线程,因为其他提供有值(value)反馈的人不会失去他们获得的声望点数) 更新
这是对 my previous question 的跟进. 假设我使用以下原型(prototype)编写了一个函数: int a_function(Foo val); 其中 foo 被认为是一个类型定
我是一名优秀的程序员,十分优秀!