首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

OpenExpressApp 平台新功能:勾選視圖——讓權限配置更直覺

     編輯:關於.NET

在 OpenExpressApp(OEA)中,「部門 + 崗位 = 角色」,功能權限歸屬角色,故配置在部門模組。傳統列表視圖需彈出對話框逐項勾選,操作繁瑣。新增 勾選視圖,將所有可選功能平鋪顯示,前置 CheckBox,單次點擊即可增刪權限,大幅提升易用性。

舊模式 vs 新模式

舊版:左側模組樹,右側分組功能清單。新增權限需點「選擇」→ 彈窗 → 勾選 → 確定 → 關窗。模組多時重複操作極其痛苦。
舊版權限配置介面

新版勾選視圖:右側直接列出所有功能,前置 CheckBox,勾選即新增、取消即移除,三步驟縮減為一步。
新版勾選視圖介面

核心實作架構

術語定義

  • 來源資料:可勾選的完整清單(舊版彈窗資料)
  • 目的資料:實際綁定的權限集合(勾選操作影響的對象)

框架層實作(隔離業務邏輯、復用既有代碼)

  1. UI:附加屬性動態插入 CheckBox 欄
    public static readonly DependencyProperty IsCheckedProperty =
        DependencyProperty.RegisterAttached("IsChecked", typeof(bool), typeof(SelectedDataAttached),
            new FrameworkPropertyMetadata(OnIsCheckedChanged));
    
    private static void OnIsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        if (d is DataGrid grid) {
            if ((bool)e.NewValue) {
                var col = new DataGridCheckBoxColumn { Header = "選擇" };
                col.Binding = new Binding(PropertyConvention.IsSelected);
                grid.Columns.Insert(0, col);
            } else if (grid.Columns[0] is DataGridCheckBoxColumn c && c.Header.Equals("選擇")) {
                grid.Columns.RemoveAt(0);
            }
        }
    }
  2. 資料載入:切換來源/目的資料
    public override void LoadData() {
        base.LoadData();
        if (AllowLoadData && AssociationOperateType.Selected == BOsPropInfo.AssociationAttribute.AssociationOperateType) {
            var src = new LateBoundObject(_data).CallMethod(MethodConvention.GetList_Selected);
            var dest = Parent.CurrentObject.GetPropertyValue(PropertyName);
            Data = src;
            (Control as UIElement).SetValue(SelectedDataAttached.DestDataProperty, dest);
        }
    }
  3. 導航過濾:同步雙向資料
    public void FilterData(IQueryObject query) {
        _data = Parent.CurrentObject.GetPropertyValue(PropertyName);
        var obj = new LateBoundObject(_data);
        if (AssociationOperateType.Self == ...) Data = obj.CallMethod(MethodConvention.GetList, query);
        else {
            Data = obj.CallMethod(MethodConvention.GetList_Selected, query);
            var dest = obj.CallMethod(MethodConvention.GetList, query);
            (Control as UIElement).SetValue(SelectedDataAttached.DestDataProperty, dest);
        }
    }
  4. 勾選事件:同步增刪目的資料
    foreach (var item in srcData) {
        ((INotifyPropertyChanged)item).PropertyChanged += (s, e) => {
            if (e.PropertyName == PropertyConvention.IsSelected) {
                bool selected = (bool)s.GetPropertyValue(PropertyConvention.IsSelected);
                if (view.BOsPropInfo.AssociationAttribute.IsForwardSelected) {
                    if (selected) AddObject(s, destData, view); else DeleteObject(s, destData, view);
                } else {
                    if (selected) DeleteObject(s, destData, view); else AddObject(s, destData, view);
                }
            }
        };
    }

業務層使用方式

1. 關聯屬性標記 Association 屬性

[Association(AssociationOperateType = AssociationOperateType.Selected,
             IsForwardSelected = false,
             SelectedPropertyMap = "BusinessObjectId;OperationId")]
public OrgPositionOperations OrgPositionOperations { ... }
  • AssociationOperateType.Selected:啟用勾選視圖
  • IsForwardSelected:true=勾選→新增,false=勾選→刪除(反向)
  • SelectedPropertyMap:來源屬性→目的屬性映射(新增時自動帶入)

2. 實作選擇適配類別(含 IsSelected 屬性)

[BusinessObject("..."), Label("對象功能")]
public partial class BoInfoOperationSelected : GBusinessBase<BoInfoOperationSelected> {
    private static PropertyInfo<bool> IsSelectedProperty = RegisterProperty(new PropertyInfo<bool>("IsSelected"));
    [EntityProperty, ShowInList, Label("選擇"), ShowInLookup]
    public bool IsSelected { get => GetProperty(IsSelectedProperty); set => SetProperty(IsSelectedProperty, value); }
    // 其他屬性:BusinessObjectId, OperationId, ObjectName...
}

3. 提供 GetList_Selected 方法(支援導航過濾)

public BoInfoOperationSelectedList GetList_Selected(OrgPositionOperationCriteria criteria) {
    return BoInfoOperationSelectedList.GetAggregationteList(criteria.BusinessObjectInfo);
}

完成上述三步,即可在零業務邏輯修改下,獲得高易用性的勾選式權限配置介面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved