1 Core.Domain.Customers.CustomerDefaults
namespace Core.Domain.Customers
{
///
/// 【用户默认--类】
///
/// 摘要:
/// 该类中的属性成员实例设定一些常量值,为获取1个指定的角色实例提供相应的支撑。
///
///
public static class CustomerDefaults
{
#region 默认角色名配置设定
///
/// 【管理员】
///
/// 摘要:
/// 设定“管理员”角色名。
///
///
public static string AdministratorsRoleName => "Administrators";
///
/// 【论坛主持人】
///
/// 摘要:
/// 设定“论坛主持人”角色名。
///
///
public static string ForumModeratorsRoleName => "ForumModerators";
///
/// 【注册用户】
///
/// 摘要:
/// 设定“注册用户”角色名。
///
///
public static string RegisteredRoleName => "Registered";
///
/// 【生产商】
///
/// 摘要:
/// 设定“生产商”角色名。
///
///
public static string VendorsRoleName => "Vendors";
///
/// 【游客】
///
/// 摘要:
/// 设定“游客”角色名。
///
///
public static string GuestsRoleName => "Guests";
#endregion
}
}
2 重构Services.Customers.CustomerServiceDefaults
///
/// 【1个指定角色名所对应的1个角色缓存键】
///
/// 摘要:
/// 设定一个缓存键实例,用于拼接1个指定的缓存键字符串,该缓存键字符与角色实体1个指定实例两者构建了缓存映射关系。
/// {0} :1个指定的角色名字符串。
///
///
public static CacheKey RolesByNameCacheKey => new("role.byname.{0}", RolesByNamePrefix);
///
/// 【1个指定角色名所对应的1个角色前缀】
///
/// 摘要:
/// 设定一个缓存键实例,用于拼接1个指定的缓存键字符串,该缓存键字符与角色实体1个指定实例两者构建了缓存映射关系。
///
///
public static string RolesByNamePrefix => "role.byname.";
3 Services.Customers.CustomerService.GetRoleByNameAsync
/// name="name">1个指定的角色名字符串。
///
/// 【异步通过角色名获取角色】
///
/// 摘要:
/// 直接从角色表中获取1个指定的角色实例;或从分布式缓存数据库获取1个指定角色的所有实例。
///
///
/// 1个指定的角色实例。
///
///
public virtual async Task<Role> GetRoleByNameAsync(string name)
{
if (string.IsNullOrWhiteSpace(name))
return null;
var key = _staticCacheManager.PrepareKeyForDefaultCache(CustomerServicesDefaults.RolesByNameCacheKey, name);
var query = from cr in _roleRepository.Table
orderby cr.Id
where cr.Name == name
select cr;
var role = await _staticCacheManager.GetAsync(key, async () => await query.FirstOrDefaultAsync());
return role;
}
4 Web.Areas.Admin.Factories.CustomerModelFactory.PrepareCustomerModelAsync
/// name="model">用户模型纪录的1个指定实例。
/// name="customer">用户实体的1个指定实例。
/// name="excludeProperties">指示是否需要把扩展属性添加到用户添加/编辑视图页面中,默认值:false,即由于该方法中使用的是非操作所以需要添加扩展属性。
///
/// 【异步预处理用户模型纪录】
///
/// 摘要:
/// 获取用户模型纪录的1个指定实例,为用户添加/编辑视图页面的渲染显示提供支撑。
///
///
/// 用户模型纪录的1个指定实例。
///
///
public virtual async Task<CustomerModel> PrepareCustomerModelAsync(CustomerModel model, Customer customer, bool excludeProperties = false)
{
if (customer != null)
{
}
else
{
//用户添加/编辑视图页面中所需的扩展属性。
if (!excludeProperties)
{
//把“注册用户”设定角色下拉框控件的默认角色实例。
var registeredRole = await _customerService.GetRoleByNameAsync(CustomerDefaults.RegisteredRoleName);
if (registeredRole != null)
model.SelectedRoleIds.Add(registeredRole.Id);
}
}
var availableRoles = await _customerService.GetAllRolesAsync();
model.AvailableRoles = availableRoles.Select(role => new SelectListItem
{
Text = role.Name,
Value = role.Id.ToString(),
Selected = model.SelectedRoleIds.Contains(role.Id)
}).ToList();
return model;
}
}
5 Web\Areas\Admin\Views\Customer\Create.cshtml
@model CustomerModel
@{
ViewData["Title"] = "添加用户";
Layout = "~/Areas/Admin/Views/Shared/_LayoutPopup.cshtml";
}
@if (ViewBag.RefreshPage == true)
{
}
asp-route-btnId="@Context.Request.Query["btnId"]"> asp-for="Username" class="form-control" /> asp-validation-for="Username" class="text-danger"> asp-for="Email" class="form-control" /> asp-validation-for="Email" class="text-danger"> asp-for="Password" class="form-control" /> asp-validation-for="Password" class="text-danger"> asp-for="Phone" class="form-control" /> asp-validation-for="Phone" class="text-danger"> asp-for="Phone" class="form-control" /> asp-validation-for="Phone" class="text-danger"> asp-validation-for="SelectedRoleIds" class="text-danger"> type="submit" value="保存" class="btn btn-primary" />
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
$(document).ready(function () {
$("#SelectedRoleIds").kendoMultiSelect({
select: function (e) {
var current = this.value();
if (this.dataSource.view()[e.item.index()].value === "0") {
this.value("");
}
else if (current.indexOf("0") !== -1) {
current = $.grep(current, function (value) {
return value !== "0";
});
this.value(current);
}
},
change: function (e) {
if (this.value().length === 0)
this.value(["0"]);
}
}).data("kendoMultiSelect");
});
}
对以上功能更为具体实现和注释见230604_023ShopRazor(多选下拉框的渲染显示)。