第23章 多选下拉框的渲染显示

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)

{

    type="text/javascript">

        //如果重置按钮定义在查询表单中时,通过下1行语句实现对弹出框的关闭。

        //window.opener.document.forms['@(Context.Request.Query["formId"])'].@(Context.Request.Query["btnId"]).click();

        //如果重置按钮单独定义时,通过下1行语句实现对弹出框的关闭。

        window.opener.document.getElementById("@Context.Request.Query["btnId"]").click();

        window.close();

   

}

class="content-header">

class="content">

    class="container-fluid">

        class="row">

            class="col-md-12">

                class="card card-primary card-outline">

                    asp-action="Create"

                          asp-route-btnId="@Context.Request.Query["btnId"]">

                        class="card-body">

                            class="mb-3">

                                asp-for="Username" class="control-label">

                                asp-for="Username" class="form-control" />

                                asp-validation-for="Username" class="text-danger">

                           

                            class="mb-3">

                                asp-for="Email" class="control-label">

                                asp-for="Email" class="form-control" />

                                asp-validation-for="Email" class="text-danger">

                           

                            class="mb-3">

                                asp-for="Password" class="control-label">

                                asp-for="Password" class="form-control" />

                                asp-validation-for="Password" class="text-danger">

                           

                            class="mb-3">

                                asp-for="Phone" class="control-label">

                                asp-for="Phone" class="form-control" />

                                asp-validation-for="Phone" class="text-danger">

                           

                            class="mb-3">

                                asp-for="Phone" class="control-label">

                                asp-for="Phone" class="form-control" />

                                asp-validation-for="Phone" class="text-danger">

                           

                            class="mb-3">

                                asp-for="SelectedRoleIds" class="control-label">

                                asp-for="SelectedRoleIds" asp-items="Model.AvailableRoles" asp-multiple="true" class="k-dropdownlist k-picker k-picker-md k-picker-solid k-rounded-md">

                                asp-validation-for="SelectedRoleIds" class="text-danger">

                           

                       

                        class="card-footer text-center">

                            type="submit" value="保存" class="btn btn-primary" />

                       

                   

               

           

       

   

@section Scripts {

    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}

   

}

    对以上功能更为具体实现和注释见230604_023ShopRazor(多选下拉框的渲染显示)。

你可能感兴趣的:(RazorUniApp,.Net7,MVC,Mul,select)