從零開始Blazor Server(10)--編輯角色
- 2022 年 8 月 11 日
- 筆記
例圖
目前的樣式是這樣的:

其中角色在一個table里,然後可以增刪改查,並且可以給指定的用戶分配許可權。
創建文件
首先我們在Pages/Admin目錄下新建一個Role.razor。因為我們的Admin目錄已經使用了_Import來給整個文件夾添加了授權特性,所以我們就無需再次添加了。
添加table
這裡添加一個table來顯示所有的角色。
<Table TItem="RoleEntity" IsBordered="true" ShowAddButton="true" ShowToolbar="true"
ShowExtendButtons="true" ShowDeleteButtonCallback="entity => entity.Id != 1"
OnQueryAsync="OnQueryAsync" OnSaveAsync="OnSaveAsync">
<TableColumns>
<TableColumn @bind-Field="@context.Name"></TableColumn>
</TableColumns>
<RowButtonTemplate>
<TableCellButton Color="Color.Success" Icon="fa fa-edit" Text="編輯許可權" OnClick="() => RoleClick(context)"></TableCellButton>
</RowButtonTemplate>
</Table>這裡稍微解釋一下這個Table。
ShowAddButton="true" ShowToolbar="true"讓table顯示工具欄並且顯示添加按鈕。
ShowExtendButtons="true"顯示每行的擴展按鈕。
ShowDeleteButtonCallback="entity => entity.Id != 1"這個注意一下,我們要保留一個管理員許可權不能刪除,所以我們這裡強制讓RoleId=1的列不顯示刪除按鈕,這樣我們就不能刪除這一列了。
OnQueryAsync="OnQueryAsync" OnSaveAsync="OnSaveAsync"這兩個方法一個是查詢時使用的,返回數據。一個是保存時使用的,修改的數據入庫。
<TableCellButton Color="Color.Success" Icon="fa fa-edit" Text="編輯許可權" OnClick="() => RoleClick(context)"></TableCellButton>這裡我們新增一個按鈕,這個按鈕就叫編輯許可權,裡面我們可以給這個角色賦權。
編寫方法
OnQueryAsync:
private Task<QueryData<RoleEntity>> OnQueryAsync(QueryPageOptions arg)
{
var roles = RoleEntity.Select.IncludeMany(x => x.Permissions).Page(arg.PageIndex, arg.PageItems)
.Count(out var count).ToList();
return Task.FromResult<QueryData<RoleEntity>>(new QueryData<RoleEntity>()
{
TotalCount = (int)count,
Items = roles
});
}這裡沒啥說的,就是使用分頁參數來分頁,並且返回總行數和分頁數據。這裡我們不涉及搜索之類的高級選項,所以整體非常簡單。
OnSaveAsync:
private Task<bool> OnSaveAsync(RoleEntity arg1, ItemChangedType arg2)
{
arg1.Save();
return Task.FromResult<bool>(true);
}這個處理更簡單,直接Save就好了。
RoleClick:
private void RoleClick(RoleEntity roleEntity)
{
RoleEntity = roleEntity;
Menus = CascadingTree(MenuEntity.Select.ToList(), roleEntity.Permissions, new TreeViewItem<MenuEntity>(new MenuEntity())).ToList();
RoleModal?.Toggle();
}
private IEnumerable<TreeViewItem<MenuEntity>> CascadingTree(IEnumerable<MenuEntity> items, IEnumerable<MenuEntity>? selectedItems, TreeViewItem<MenuEntity> parent) => items.Where(i => i.ParentId == parent.Value.Id).Select(i =>
{
var item = new TreeViewItem<MenuEntity>(i)
{
Text = i.Name,
Icon = i.Icon,
Value = i
};
item.Items = CascadingTree(items, selectedItems, item).ToList();
item.Parent = parent;
if (selectedItems?.Any(x => x.Id == i.Id) == true)
{
item.CheckedState = CheckboxState.Checked;
}
return item;
});這裡的分配許可權點擊後有兩個事要做,一個是獲取到所有的Menu,並且做成TreeItem的List,並且根據本身的許可權給tree進行勾選。另一個就是打開Modal。
添加Modal
這裡我們直接使用Modal來做了,理解起來相對比較簡單,如果是正式項目,建議還是使用Dialog來做,更清晰一些。
這裡我們在項目里繼續加上Modal
<Modal @ref="RoleModal">
<ModalDialog Title="編輯許可權">
<BodyTemplate>
<TreeView TItem="MenuEntity" Items="@Menus" ShowCheckbox="true" AutoCheckParent="true" AutoCheckChildren="true"></TreeView>
</BodyTemplate>
<FooterTemplate>
<Button OnClick="SavePermission">保存</Button>
</FooterTemplate>
</ModalDialog>
</Modal>這個Modal只有一個功能,就是在Save的時候獲取到所有的已勾選許可權,存庫。
private void SavePermission()
{
if (RoleEntity == null)
{
return;
}
var menus = new List<MenuEntity>();
SaveRole(Menus!.Where(x => x.CheckedState != CheckboxState.UnChecked), menus);
RoleEntity.Permissions = menus;
RoleEntity.SaveMany(nameof(RoleEntity.Permissions));
RoleModal?.Toggle();
}
private void SaveRole(IEnumerable<TreeViewItem<MenuEntity>> items, List<MenuEntity> menus)
{
menus.AddRange(items.Select(x => x.Value));
foreach (var treeViewItem in items)
{
if (treeViewItem.Items.Any(x => x.CheckedState != CheckboxState.UnChecked))
{
SaveRole(treeViewItem.Items.Where(x => x.CheckedState != CheckboxState.UnChecked), menus);
}
}
}程式碼在Github://github.com/j4587698/BlazorLearn,分支lesson10。

