You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Devexpress XAF(Blazor):通过弹出窗口编辑对象属性的实现疑问

XAF中通过Action弹出窗口编辑字符串属性并添加时间戳和用户名

1. 创建临时DTO类

XAF的DetailView需要绑定到对象,因此先定义一个无需持久化的领域组件(DTO)来承载要编辑的备注内容:

using DevExpress.Persistent.Base;

[DomainComponent]
public class CommentsEditDto
{
    [Size(SizeAttribute.Unlimited)]
    public string EditComments { get; set; }
}

2. 在Action控制器中实现弹窗逻辑

在已创建的控制器里,完成弹窗创建、内容编辑与回调更新的逻辑:

using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using DevExpress.Persistent.Base;

public class CommentsEditController : ViewController<ObjectView>
{
    public CommentsEditController()
    {
        var editCommentsAction = new SimpleAction(this, "EditComments", PredefinedCategory.Edit);
        editCommentsAction.Execute += EditCommentsAction_Execute;
        // 仅在MyBaseClass对象的详情页显示该Action
        editCommentsAction.TargetObjectType = typeof(MyBaseClass);
        editCommentsAction.TargetViewType = ViewType.DetailView;
    }

    private void EditCommentsAction_Execute(object sender, SimpleActionExecuteEventArgs e)
    {
        var currentObj = e.CurrentObject as MyBaseClass;
        if (currentObj == null) return;

        // 初始化DTO并赋值当前备注内容
        var dto = new CommentsEditDto { EditComments = currentObj.Comments };

        // 创建DTO对应的ObjectSpace与DetailView
        var dtoOs = Application.CreateObjectSpace(typeof(CommentsEditDto));
        var dtoInOs = dtoOs.GetObject(dto);
        var detailView = Application.CreateDetailView(dtoOs, dtoInOs);
        
        // 配置弹窗属性
        detailView.ViewEditMode = ViewEditMode.Edit;
        detailView.Caption = "编辑备注";

        // 创建弹窗控制器并处理确认回调
        var dialogController = Application.CreateController<DialogController>();
        dialogController.AcceptAction.Execute += (s, args) =>
        {
            var editedContent = dtoInOs.EditComments;
            if (string.IsNullOrEmpty(editedContent)) return;

            // 拼接用户名与时间戳前缀
            var currentUser = SecuritySystem.CurrentUser as YourUserType; // 替换为你的实际用户类
            var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            var prefix = $"[{timestamp}] {currentUser.UserName}: ";

            // 更新原对象的备注字段
            var originalOs = View.ObjectSpace;
            var originalObj = originalOs.GetObject(currentObj);
            originalObj.Comments = string.IsNullOrEmpty(originalObj.Comments)
                ? prefix + editedContent
                : originalObj.Comments + Environment.NewLine + prefix + editedContent;
            
            originalOs.CommitChanges();
            View.Refresh();
        };

        // 弹出窗口
        Application.ShowViewStrategy.ShowViewInPopupWindow(detailView, dialogController);
    }
}

3. 自定义弹窗编辑器(可选)

如果需要多行文本编辑,可在Model Editor中配置:

  • 导航到BOModel > CommentsEditDto > Views > CommentsEditDto_DetailView > Items > EditComments
  • 将EditorType设置为对应平台的多行编辑器:WinForms选WinMemoPropertyEditor,Web选ASPxMemoPropertyEditor

4. 关键注意事项

  • 替换代码中的YourUserType为项目实际的用户业务类(如继承自PermissionPolicyUser的类)
  • 确保MyBaseClass的Comments字段标记了[Size(SizeAttribute.Unlimited)],支持多行文本存储
  • Web端与WinForms端逻辑一致,仅编辑器类型需对应调整

内容的提问来源于stack exchange,提问作者Jeff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:50:23