DevExpress XAF:跨平台 .NET 应用程序 UI 和 Web API v24.1
Blazor – CRUD
Blazor——可用性
Blazor – 额外模块
实体框架
保安系统
多租户
跨平台增强功能
Blazor – CRUD
#在网格列表编辑器中批量/单元格编辑
批量编辑支持通过单一选项(InlineEditMode = Batch)正式在 XAF Blazor v24.1 中提供 - 与其 XAF WebForms 对应部分非常相似。
Roman Shelomanov
我们从 24.1 EAP 开始测试它,现在在 24.1.2 Beta 中,它运行良好。非常感谢您完成它,这是让 Blazor 与多年来我们许多人使用和喜爱的 WinForms 功能相同的额外一步。
#当 DataAccessMode = Server 时将数据从网格列表编辑器导出到 Excel
我们的 Blazor 组件和 XAF v24.1 支持与服务器端数据绑定的网格的 Excel 导出功能(适用于 EF Core 和 XPO ORM)。要将数据导出到 Excel,DevExpress Blazor Grid 将显示加载指示器并从数据源下载所有记录。

#在运行时将新字段添加到网格和布局控件的自定义表单中
XAF WinForms 应用程序包含一个对象模型对话框。通过该对话框,最终用户可以搜索、勾选或取消勾选尚未显示在网格或布局控件中的数据模型字段(包括子字段和集合)(作为列选择器或自定义表单的一部分)。
与 Microsoft Office 应用非常相似,此功能允许用户完全自定义列表和详细信息表单(基于数据模型的结构)。同样,当开发人员需要在不重新部署的情况下解决业务需求的变化时,此功能非常有用。有关更多信息,请参阅ASP.NET Core Blazor 应用程序中的运行时布局自定义。
XAF Blazor v24.1 为 ListView(列选择器)和 DetailView(自定义表单) 提供了类似的体验。此功能消除了在设计时模型编辑器(在 Visual Studio 内部)中进行许多 UI 自定义的需要 - 这是许多人在 XAF WinForms UI 中喜欢的功能。当然,您也可以为最终用户禁用这些运行时功能。


Blazor——可用性
Philippe Petrussa
正如您在一篇文章中提到的那样,DevExpress 大大减少了样板代码,以便将 Blazor 编辑器集成到 XAF Blazor 中。干得好!
#选项卡式 MDI 支持
选项卡式 MDI 是许多现代应用程序(包括您最喜欢的 Web 浏览器或 Microsoft Outlook Web)中都存在的多文档界面 (MDI) UI 隐喻。它是一种强大的界面,可最大限度地利用文档屏幕空间,尤其是在处理多个文档、电子邮件等时。
默认情况下,XAF WinForms 应用程序中启用了选项卡式 MDI,并且 XAF Blazor 在 v24.1 中提供了类似的用户体验。您还可以在模型编辑器中自定义选项卡式 MDI,如下所示:
在应用程序运行之间恢复以前打开的选项卡(RestoreTabbedMdiLayout默认情况下为 True)。
在标签焦点上刷新视图数据源(RefreshViewOnTabFocus默认情况下为 False)
显示或隐藏标签图像(ShowTabImage默认为 True)
此外,您还可以使用代码访问底层选项卡控件,并根据需要使用控制器(在“SolutionName.Blazor”项目中)对其进行配置。例如,您可以按需或同时加载选项卡:
C#
protected override void OnFrameAssigned() {
base.OnFrameAssigned();
Frame.TemplateChanged += Frame_TemplateChanged;
}
void Frame_TemplateChanged(object sender, EventArgs e) {
if(Frame.Template is ITabbedMdiMainFormTemplate template) {
template.TabsModel.RenderMode = DevExpress.Blazor.TabsRenderMode.AllTabs;
}
}
#简化自定义 Blazor 属性和列表编辑器的创建
在 v24.1 中,我们减少了许多流行的 UI 定制场景的样板代码:
创建自定义属性和列表编辑器。
列表/属性编辑器无需适配器即可访问代码中的控制选项。
以前,XAF Blazor 开发人员必须创建中间组件适配器、渲染器和其他样板类,这很麻烦或很嘈杂。
在此版本中,所需代码量大大减少(与 XAF WinForms 版本类似)。我们的内置ComponentModel类现在可以处理组件事件(TextChanged、DateChanged、TimeChanged 等)并自动读取和写入组件值(文本、日期、时间等)。基于组件模型的Blazor 属性编辑器ValueChanged的最小实现在 v24.1 中如下: DxTextBoxModel
C#
[PropertyEditor(typeof(string), false)]
public class CustomStringPropertyEditor : BlazorPropertyEditorBase {
public CustomStringPropertyEditor(Type objectType, IModelMemberViewItem model) : base(objectType, model) { }
public override DxTextBoxModel ComponentModel => (DxTextBoxModel)base.ComponentModel;
protected override IComponentModel CreateComponentModel() => new DxTextBoxModel();
}用于自定义列表视图或详细信息视图属性编辑器控件的控制器代码在 v24.1 中也更简单(因为不需要适配器):
C#
public class CustomizeDateEditorController : ViewController<DetailView> {
protected override void OnActivated() {
base.OnActivated();
View.CustomizeViewItemControl<DateTimePropertyEditor>(this, CustomizeDateTimeEditor);
}
void CustomizeDateTimeEditor(DateTimePropertyEditor propertyEditor) {
// v23.2
//if(propertyEditor.Control is DxDateEditAdapter adapter) {
// adapter.ComponentModel.TimeSectionVisible = true;
//}
// v24.1+
propertyEditor.ComponentModel.TimeSectionVisible = true;
}
}我们最新的Outlook Inspired Demo 应用包含许多自定义属性和列表编辑器。它是 v23.2 和 v24.1 之间 UX 验证/比较的绝佳来源。
Martin Praxmarer
我真的很喜欢它——我在近 5 分钟内集成了新的 Blazor 进度条——无需创建适配器——也无需创建 Razor 组件!谢谢大家——简直太棒了!
#辅助功能增强和键盘支持
目前,XAF(ASP.NET Core Blazor、WinForms 和 ASP.NET WebForms 的 UI)附带部分可访问性支持,与各个 UI 平台上相应的 DevExpress UI 控件中的支持相似:
DevExpress ASP.NET Core Blazor
DevExpress WinForms
DevExpress ASP.NET Web 表单
DevExpress DevExtreme(DevExtreme UI 控件用于 XAF ASP.NET Core Blazor 和 ASP.NET Web Forms UI。)
XAF Blazor 还附带了自己的一组 UI 组件/元素(例如属性编辑器和操作容器)。在 v24.1 中,我们扩展了可访问性支持并改进了所有 XAF Blazor UI 元素(约 20% 的场景)的键盘支持。一旦我们在 2024 年增强 DevExpress Blazor UI 组件的可访问性,XAF 可访问性支持也将自动升级。
我们的 Blazor Grid 的键盘导航选项也正式发布,并在 XAF Blazor 中默认启用。
Blazor – 额外模块
#调度模块 - 共享/多个资源
在 v24.1 中,底层 Blazor 调度程序组件 ( DxScheduler ) 支持为调度程序约会/事件提供多种资源。XAF Blazor Scheduler 模块现在还允许您使用共享资源。以前,DxScheduler 中只允许使用单个资源,当您尝试将多个资源链接到一个约会时,XAF 会显示验证错误消息。

#通知模块支持
XAF Blazor v24.1 支持我们的通知模块。该模块允许您显示调度程序约会或任何自定义对象(例如任务)的提醒。调度程序约会/事件的详细信息表单还允许您配置类似于 Microsoft Outlook 中提供的提醒。
在通知模块的帮助下,您的应用可以在约会/活动开始时间之前显示一个弹出窗口。
注意:我们的通知模块不必与 Scheduler 模块绑定:它可以显示来自任何地方的通知。在后一种情况下,作为开发人员,您的目标是为通知服务提供通知项目,服务将根据需要处理它们。


#迁移到本机 Blazor 报告查看器
在 v24.1 中,XAF 的 Blazor 报告模块使用 Blazor Server 应用程序的本机报告查看器(DxReportViewer),而不是基于 JavaScript 的报告查看器(DxDocumentViewer)。
本机报告查看器为 XAF Blazor 开发人员带来了许多好处:
支持 Size Modes 和所有 Blazor 主题
使用纯 C#,无需 JS,即可轻松定制
改进的性能:与基于 JavaScript 包装器的报告工具相比,本机实现减少了加载时间并提高了页面导航速度。
实体框架
#EF Core 8 ORM 支持
EF Core 8 支持在 v24.1 中正式发布,适用于 XAF 和相关的后端 Web API 服务。EF Core 8 是 Entity Framework 的最新生产就绪版本。
虽然 EF Core 8 与其前身相比具有许多优势(包括性能和定制),但它也引入了一系列我们需要解决的重大变化(例如,DateOnly 和 TimeOnly 支持)。
有关最新 EF Core 更新的更多信息,请参阅以下 Microsoft 文档:
EF Core 8 中的新增功能
EF Core 8 重大变化
EF Core 8 与 XPO ORM 的性能基准
#EF Core 中聚合一对多集合的级联删除
在 v24.1 中,XAF 的解决方案向导包含modelBuilder.SetOneToManyAssociationDeleteBehavior(DeleteBehavior.SetNull, DeleteBehavior.Cascade);在基于 EF Core 的应用程序的 OnModelCreating 方法中。此代码将分别为非聚合的一对多关联配置“DeleteBehavior.SetNull”和为聚合的一对多关联配置“DeleteBehavior.Cascade”。以前,EF Core 不会像 XPO ORM 那样考虑 XAF 的 Aggregated 属性(并且在某些 ListView 场景中可能会有例外)。
#值得注意的与 EF Core 相关的错误修复
除了新功能之外,我们还在 v24.1 发布周期中解决了以下问题:
T1217729 - 核心 - 调度程序事件通知在 EF Core 应用程序中不起作用
T1230436 - 核心 - 应用程序模型中缺少 EF Core 的 DbContext 中未包含的基类的属性
T1219872 - 核心 - InstantFeedback 模式下的根 ListView 不会使用 EF Core 更新修改后的对象数据
T1204704 - WinForms - EF Core 的参考属性的列标题过滤器为空
保安系统
#单点登录支持
在 v24.1 中,XAF Blazor 和 WinForms .NET 6+ 应用程序原生支持单点登录 (SSO)。如今,现代商业应用程序与组织内的许多外部系统集成在一起。例如,如果组织使用 Microsoft 365,则 XAF 应用程序通常在https://myapps.microsoft.com/以及该组织内的许多其他应用程序中可用。由于 XAF Blazor 和 WinForms .NET 6+ 应用程序(基于 XPO 和 EF Core)支持 Microsoft Entra ID 和其他OAuth2 提供程序,因此组织希望/希望 XAF 应用程序与现有系统/服务(如Microsoft Entra SSO)共享相同的登录详细信息或身份验证 cookie 。
换句话说,组织需要满足以下要求:当用户已在组织内通过身份验证(例如,使用 Microsoft 365)时,XAF 应用必须与 SSO 无缝协作。以前,XAF 开发人员必须实施自定义解决方案来修改 XAF 的登录表单和身份验证行为以支持 SSO。
重要的 SSO 场景包括但不限于以下内容:
如果用户未在组织内登录,则 XAF 应用将显示标准 OAuth2/SSO 提供商登录表单(就像 Teams、Word 或 Outlook 通常为 Microsoft 365 所做的那样)。如果用户被管理员强制注销,则 XAF 应用也应显示标准登录表单。
如果用户在组织内登录(可以是另一个非 XAF 应用程序),则不会为用户显示任何 XAF 登录表单,焦点将直接移至 XAF 应用程序 UI(通过组织的“应用程序仪表板”中的链接或通过其他方法)。XAF 应用程序中的登录过程在后台自动进行(通过 API 调用)。在这种情况下,不应强迫 XAF 用户明确按下“使用 Microsoft 登录”,因为 SSO 将“正常工作”。
#绕过内部业务逻辑的安全权限检查
此外,现在可以从 BaseObject 后代中调用新的SetPropertyValueWithSecurityBypass方法来绕过内部应用程序逻辑中某些受保护属性的安全检查(也支持自定义基类)。
当您希望设置 CreatedBy、ModifiedBy、CreatedOn、UpdatedOn 等服务属性时,此功能对于 XAF 开发人员尤其有价值 - 我们的审计跟踪和模型差异模块使用类似的机制运行。该SetPropertyValueWithBypassSecurity方法可以代表受限/普通用户在代码中自由设置受保护的属性,就像应用程序管理员一样 - 无需知道管理员凭据(例如服务任务的模拟)。
C#
ApplicationUser GetCurrentUser() {
return ObjectSpace.GetObjectByKey<ApplicationUser>(
ObjectSpace.ServiceProvider.GetRequiredService<ISecurityStrategyBase>().UserId);
}
public override void OnSaving() {
base.OnSaving();
if (ObjectSpace.IsNewObject(this)) {
SetPropertyValueWithSecurityBypass(nameof(CreatedBy), GetCurrentUser());
}
else {
SetPropertyValueWithSecurityBypass(nameof(UpdatedBy), GetCurrentUser());
SetPropertyValueWithSecurityBypass(nameof(UpdatedOn), DateTime.Now);
}
}您可能知道,这是许多 XAFers长期要求的选项- 该选项阻止从集成模式到中间层安全性的完全迁移(因为CreateNonsecuredObjectSpace和其他解决方法不方便)。
还SetPropertyValueWithBypassSecurity包括某些限制,例如仅支持从内部调用此方法BaseObject.OnSaving(为了获得最佳安全性)或绕过的属性无法在内部更新其他受保护的属性。我们认为这个新选项将覆盖 80% 的常见用例。
#增强 WinForms 应用程序的中间层安全性的性能
具有中间层安全性 的 XAF WinForms在 v24.1 中的执行速度要快得多。与 v23.2 相比,我们提升了 EF Core 8 和 XPO ORM 的性能(XPO ORM 的结果甚至更好 - 提高了 2.5 倍)。下图显示了 EF Core 8 在 24.1 和 v23.2 中的性能测试批次和单个测试的当前持续时间。

多租户
#使用自定义字段扩展内置租户类
您现在可以扩展标准Tenant类,以将其他数据(例如模块和功能许可证信息)与存储在应用程序主机数据库中的租户关联起来。当然,您也可以稍后在代码中访问自定义 Tenant 字段(从 Controller或Application Builders中)。我们还为 EF Core 和 XPO ORM 提供了此功能支持。
C#
// MySolution.Module\BusinessObjects\CustomTenant.cs
// EF Core
using DevExpress.Persistent.BaseImpl.EF.MultiTenancy;
public class CustomTenant : Tenant {
public virtual string CustomField { get; set; }
}
// MySolution.Blazor.Server/Startup.cs (MySolution.Win/Startup.cs)
builder.AddMultiTenancy()
.WithCustomTenantType<CustomTenant>()
//...
#WinForms 应用程序的中间层安全性:多租户和 OAuth2 支持
在 v24.1 中,具有中间层安全性的 XAF WinForms 应用程序 (.NET 6+) 原生支持多租户和OAuth2 提供商(例如 Microsoft Entra ID 或 Google)。我们的Outlook Inspired Demo现在也使用具有多租户模块的中间层安全性。
正如我们在“安全注意事项”帮助主题中所述,Windows 桌面应用可以通过我们的中间层应用服务器更好地满足企业安全标准。借助我们的解决方案,EF Core 或 XPO 开发人员可以保留其标准 DbContext 或 Session,并从任何 .NET 客户端(如 XAF WinForms 或非 XAF 应用)启动到数据存储的远程连接。此功能在某些环境/业务应用中至关重要(由于安全考虑而无法维持直接数据库连接的应用)。
非 XAF EF Core 或 XPO 开发人员可以从我们的中间层应用程序服务器中受益,并使用他们的实体数据模型保留 DbContext 或 Session(了解更多)。这对于许多桌面 .NET 开发人员(WinForms、WPF、WinUI 等)尤其重要,他们现在需要满足更高的安全标准。简而言之,这些开发人员需要改造/现代化他们的 Windows“胖客户端”(#1),或者使用现代 Web 技术和云服务从头开始重做一切(#2)。我们的中间层安全性允许您选择“更简单”且可能更可靠的路线(#1),并使用中间件“替换”直接数据库连接。查看以下代码片段以获取有关此方面的更多信息:
C# var httpRemoteRepository = new HttpRemoteRepository(httpClient, typeof(EFCoreDbContext).FullName); var optionsBuilder = new DbContextOptionsBuilder<EFCoreDbContext>(); optionsBuilder.UseMiddleTier(opt => opt.UseRemoteRepository(httpRemoteRepository)); optionsBuilder.UseChangeTrackingProxies(); optionsBuilder.UseLazyLoadingProxies(); var dbContextOptions = optionsBuilder.Options; var dbContext = new EFCoreDbContext(dbContextOptions); var users = dbContext.Employees.ToList();
#针对 XAF 和非 XAF UI 客户端的 Web API 服务(由 EF Core 和 XPO ORM 提供支持)
在 v24.1 中,我们的后端 Web API 服务支持EF Core 和 XPO ORM 的 多租户。
我们的 Web API 服务既有免费功能(基本 CRUD),也有付费功能(如报告、审计跟踪、验证、文件附件、本地化等)。我们还分发了许多演示应用程序,演示了如何使用.NET MAUI、Blazor WebAssembly、JavaScript等免费和付费 API (要使用付费功能,您必须拥有 DevExpress 通用订阅许可证)。
要了解有关我们的 Web API 服务的更多信息并确定它是否对您的组织有价值,请查看以下博客文章:有关新的 DevExpress Web API 服务(由 Entity Framework 和 XPO ORM 提供支持)的常见问题。
跨平台增强功能
#从 Newtonsoft.Json 迁移到 System.Text.Json
“System.Text.Json”库现在用于反序列化后端 Web API 服务端点的输入参数。
有关更多信息,请参阅以下博客文章:.NET 和 .NET Framework — 从 Newtonsoft.Json 迁移到 System.Text.Json (v24.1)。
#EF Core 8 和 Blazor/WinForms UI 支持新的 .NET DateOnly 和 TimeOnly 类型
正如您可能在上面的 EF Core 8 重大变化中读到的那样,SQL Server 日期和时间现在支持 .NET DateOnly 和 TimeOnly,XAF Blazor 和 .NET 6+ 的 WinForms 应用程序中的网格列表编辑器和相关的日期/时间属性编辑器现在相应地支持新的 .NET 类型。
底层Blazor和WinForms网格组件支持 DateOnly/TimeOnly 操作(排序、分组、过滤,包括过滤器编辑器自动过滤行、列标题过滤器)——标准语言、服务器模式和 EF Core 的其他底层数据访问组件也将如此。
#命令行界面 (CLI) 解决方案向导模板
XAF v24.1 允许您使用.NET 命令行界面 (CLI)或“dotnet”工具从控制台快速创建 XAF Blazor 和 WinForms 应用程序(无需使用 XAF 的解决方案向导)。这类似于 DevExpress Reports 实现:使用 .NET CLI 模板。
此功能对于在 Windows 和非 Windows 开发环境(如 Linux 或 MacOS)中使用 Microsoft Visual Studio Code (VS Code) 或 JetBrains Rider 的 XAF 开发人员来说非常有价值。以前,这些用户必须首先使用解决方案向导在 Visual Studio for Windows 中创建 XAF 项目。
CLI dotnet new install DevExpress.XAF.ProjectTemplates::24.1.3 dotnet new dx.xaf -p blazor win -e2e -api Standalone -s MiddleTier -n MyCoolApp cd MyCoolApp dotnet run
#XPO ORM 数据模型向导 — 信任级别证书和加密选项
请注意,下面描述的更改已在我们当前主要版本的最新更新中可用:v23.2.5。
在将报告绑定到 MS SQL Server 实例时, 我们增强了数据源向导 中的用户体验。数据源连接屏幕现在具有屏幕截图上标记的两个新选项:

如果您无法以不同方式设置 MS SQL Server, 这些新选项/更改可让您在将报告绑定到 MS SQL Server 数据库时避免出现“证书链由不受信任的机构颁发”错误。在以下 Microsoft 主题中了解有关此错误及其原因的更多信息:证书链由不受信任的机构颁发 - SQL Server(Microsoft Learn)。

渝公网安备50010702505508