前言

文章的标题是不是感觉有点奇怪,但实际我们在XAFBlazor中使用Blazor组件是很繁琐的,我们需要将Blazor组件封装成属性编辑器(PropertyEditor),再用非持久化对象(NonPersistentObject)去承载它。当我们有许多这样的Blazor组件时,不仅工作量大,同时还容易出错。下面我们通过一个巧妙的方式来减少这样重复的操作,这篇文章只是给出原理,EasyXaf.BlazorTabbedMdi模块( https://www.cnblogs.com/haoxj/p/16916525.html )对它做了实现。

演示

整体演示

基本使用

Blazor项目自带示例

在Blazor组件中添加 @attribute [ComponentNavigationItem] 就可以将Blazor组件添加到XAF导航栏中

Blazor组件中使用XAF

XAF中的很多服务都已注册到了容器中,如IObjectSpaceFactory,它可以创建一个IObjectSpace对象,通过它我们可以操作XAF中的BO,如果你想访问Application,可以注入IXafApplicationProvider,它有一个GetApplication方法。

注意:在XAF中自己创建的IObjectSpace对象,需要自己销毁,View中的IObjectSpace对象,XAF会自动销毁

模态弹窗

在Blazor组件中

前面是将Blazor组件在主窗口中显示,我们也可将其在模态窗口中显示

我们还可以给Blazor组件传递参数,同时Blazor组件也可以返回结果

Blazor组件代码

演示

在ViewController中

前面是在Blazor组件中调用弹窗,在ViewController中也是可以的

演示

原理

在继续阅读之前,你需要知道如何将Blazor组件集成到XAF中去,在有了上面所说的知识后,我们说一下它的实现原理及注意事项。

我们知道在导航项(IModelNavigationItem)中有ObjectKey属性及View属性,将View设置为一个详情视图(DetailView),将ObjectKey设置为相应的主键,就可以直接导航到对应的详情。我们将其改造一下,详情视图是展示Blazor组件的视图,而ObjectKey是Blazor组件的类型名称,这样我们就可以设置不同的ObjectKey值来展示不同的Blazor组件。详情视图的ModelClass是一个非持久化对象,代码如下:

由于非持久化对象的数据需要我们自己提供,我们可以订阅NonPersistentObjectSpace的ObjectByKeyGetting事件,通过Key的值返回对应的Blazor组件类型,代码如下:

需要注意ObjectKey中不能包含点(.),由于XAFBlazor会将ObjectKey作为Url的一部分,而Blazor中对点的处理是请求文件,所以这里我们将点替换为减号(-)。

当我们得到了Blazor组件的类型后,我们就可以将其展示出来,代码如下:

DynamicComponent可以通过类型动态加载组件

上面就是在XAF中使用Blazor组件的思路,如果想再丰富一些,可以创建一个ComponentNavigationItemAttribute,将其放到Blazor组件中,用于收集导航,这是XAF模型的知识,可以参考之前的文章。

写在最后

在XAFBlazor中直接使用Blazor组件,是一种新的开发体验,这样可以最大程度的扩展XAFBlazor功能,同时也可充分利用WEB开发社区的其它组件。

XAF Blazor 中使用 Blazor 组件的更多相关文章

  1. [AspNetCore 3.0] 在RazorPages/MVC 中使用 Blazor (Razor组件)

    开发环境 Vs2019 16.3.1 dotnetcore 3.0 一.开始 新建webapp项目 dotnet new webapp -o projectname 或Vs 中新建项目选择 Web应用 ...

  2. 【Blazor】在ASP.NET Core中使用Blazor组件 - 创建一个音乐播放器

    前言 Blazor正式版的发布已经有一段时间了,.NET社区的各路高手也创建了一个又一个的Blazor组件库,其中就包括了我和其他小伙伴一起参与的AntDesign组件库,于上周终于发布了第一个版本0 ...

  3. Blazor中的无状态组件

    声明:本文将RenderFragment称之为组件DOM树或者是组件DOM节点,将*.razor称之为组件. 1. 什么是无状态组件 如果了解React,那就应该清楚,React中存在着一种组件,它只 ...

  4. Blazor组件自做十三: 使用 Video.js 在 Blazor 中播放视频

    Video.js 是一个具有大量功能的流行的视频和音频 JavaScript 库,今天我们试试集成到 Blazor . Blazor VideoPlayer 视频播放器 组件 示例 https://b ...

  5. 在Asp.net Razor Pages/MVC程序中集成Blazor

    今天试了一下在Asp.net core Razor Pages/MVC程序中集成Blazor(Server-side),还是可以完美整合的,这里以Razor Pages为例(.net core 3.1 ...

  6. Blazor中的CSS隔离

    1.环境 VS 2019 16.9.0 Preview 1.0 .NET SDK 5.0.100 2.前言 CSS一旦生效,就会应用于全局,所以很容易出现冲突.为了解决这个问题CSS隔离就顺势而生.B ...

  7. Blazor和Vue对比学习(基础1.8):Blazor中实现计算属性和数据监听

    1.7章<传递UI片断>,需要做几个案例,这部分暂停消化几天.我们先把基础部分相对简单的最后两章学习了. 计算属性和数据监听是Vue当中的概念,本质上都是监听数据的变化,然后做出响应.两者 ...

  8. Blazor和Vue对比学习(知识点杂锦3.04):Blazor中C#和JS互操作(超长文)

    C#和JS互操作的基本语法是比较简单的,但小知识点特别多,同时,受应用加载顺序.组件生命周期以及参数类型的影响,会有比较多坑,需要耐心的学习.在C#中调用JS的场景会比较多,特别是在WASM模式下,由 ...

  9. 【ASP.NET Core】在Blazor中获取 HTTP 上下文信息

    今天咱们来扯一下 Blazor 应用程序怎么访问 HttpContext.其实这句话有坑,为了避免大伙伴们掉茅坑,老周直接说明:Blazor 是不能访问 HttpContext 的.哪怕你在服务容器中 ...

  10. 如何实现在react现有项目中嵌入Blazor?

    如何实现在react现有项目中嵌入Blazor? 目前官方只提供了angular和react俩种示例所以本教程只将react教程 思路讲解: 首先在现有react项目中我们可能某些组件是在Blazor ...

随机推荐

  1. CentOS使用iptables开放3000端口

    关闭firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service 设置ipt ...

  2. 深度学习应用篇-计算机视觉-目标检测[4]:综述、边界框bounding box、锚框(Anchor box)、交并比、非极大值抑制NMS、SoftNMS

    深度学习应用篇-计算机视觉-目标检测[4]:综述.边界框bounding box.锚框(Anchor box).交并比.非极大值抑制NMS.SoftNMS 1.目标检测综述 对计算机而言,能够&quo ...

  3. C/C++ 实现简易HTTP服务器

    #include <stdio.h> #include <stdlib.h> #include <process.h> #include <WinSock2. ...

  4. 7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析

    本文给大家介绍一下在 Spring Boot 项目中如何集成消息队列 RabbitMQ,包含对 RibbitMQ 的架构介绍.应用场景.坑点解析以及代码实战.最后文末有免费领取龙年红包封面以及腾讯云社 ...

  5. JavaScript快速入门(一)

    JavaScript快速入门(二) 语句 只需简单地把各条语句放在不同的行上就可以分隔它们 var a = 1 var b = 2 如果想把多条语句放在同一行上,就需要用分号隔开 var a = 1; ...

  6. Java执行Shell和传输文件

    特性: 多线程批量执行 多密码尝试 引入依赖: <dependency> <groupId>ch.ethz.ganymed</groupId> <artifa ...

  7. HarmonyOS 开发入门(一)

    HarmonyOS 开发入门(一) 日常逼逼叨 因为本人之前做过一些Android相关的程序开发,对移动端的开发兴趣比较浓厚,近期也了解到了一些关于华为HarmonyOS 4.0 的事件热点,结合黑马 ...

  8. CF1841

    A 题意:给一个长度为 \(n\) 的全是 \(1\) 的数列,Alice 先操作,Bob 交替.每次操作选择至少两个(可以更多)相等的数字,删除它们,在序列中加入它们的和.直到有人不能操作为止,这个 ...

  9. 100 行代码实现用户登录注册与 RESTful 接口 - 手把手教程附 Python 源码

    在开发大多数应用时,用户系统都是必不可少的部分,而我们总是需要开发围绕用户的登录,注册,获取,更新等接口.在这篇文章将带你用一百多行代码简洁地实现一套这样的用户鉴权与 RESTful 接口,并使用 S ...

  10. 使用JS快速读取TXT文件

    1 前言 最近有个需求,需要使用JS快速读取外部大数据文件(60w条记录的表).笔者尝试过使用JS读取Excel文件,但是跑了十几分钟仍未出结果,后来笔者尝试将原数据保存为TXT文件,再从TXT文件中 ...