第25章 用户编辑与bootstrap-fileinput头像上传

1 Services.Media.MediaDefaults

namespace Services.Media

{

    ///

    /// 【多媒体默认--类】

    ///

    /// 摘要:

    ///    该类中的属性成员实例设定一些常量值,为多媒体服务相关类的定义实现提供相应的支撑。

    ///

    ///

    public static partial class MediaDefaults

    {

        #region 用户头像相关配置设定

        ///

        /// 【头像默认目录】

        ///

        /// 摘要:

        ///     设定用户头像持久化存储的默认目录。

        ///

        ///

        public static string DefaultAvatarDirectory => @"\images\Avatar";

        ///

        /// 【默认头像文件名】

        ///

        /// 摘要:

        ///     设定用户默认头像图片的文件名。

        ///

        ///

        public static string DefaultAvatarFileName => "Default.jpg";

        ///

        /// 【默认头像路径】

        ///

        /// 摘要:

        ///     设定用户默认头像图片持久化存储的本地格式的相对路径字符串。

        ///

        ///

        public static string DefaultAvatarPath => @"\images\Avatar\Default.jpg";

        #endregion

    }

}

2 Web.Areas.Admin.Controllers.CustomerController.Edit

/// name="model">用户模型记录的1个指定实例。

        ///

        /// 【添加用户】

        ///

        /// 摘要:

        ///     通过添加用户Razor页面中的数据,把用户实体的1个指定实例持久化到用户表中。

        ///

        ///

        /// 返回:

        ///     用户模型记录的1个指定实例。

        ///

        ///

        [HttpPost]

        public async Task<IActionResult> Edit(CustomerModel model)

        {

            //后端手动对角色多选下拉框中的输入进行验证。

            if (model.SelectedRoleIds.Count <= 0)

            {

                ModelState.AddModelError("SelectedRoleIds", "必须选择1个角色。");

            }

       

            var customer = await _customerService.GetCustomerByIdAsync(model.Id);

            var allRoles = await _customerService.GetAllRolesAsync(true);

            var newRoles = new List<Role>();

            foreach (var role in allRoles)

                if (model.SelectedRoleIds.Contains(role.Id))

                    newRoles.Add(role);

            if (ModelState.IsValid)

            {

                customer.Username = model.Username;

                customer.Email = model.Email;

                customer.Phone= model.Phone;

                customer.IsSystemAccount = model.IsSystemAccount;

                customer.Active = model.Active;

                customer.Deleted = model.Deleted;

                if(!string.IsNullOrEmpty(model.Password))

                {

                    var saltKey = _encryptionService.CreateSaltKey(CustomerServicesDefaults.PasswordSaltKeySize);

                    customer.PasswordSalt = saltKey;

                    customer.Password = _encryptionService.CreatePasswordHash(model.Password, saltKey, CustomerServicesDefaults.DefaultHashedPasswordFormat);

                }

                if(model.FormFile != null)

                {

                    if (!string.IsNullOrEmpty(customer.Avatar)&&!_nopFileProvider.GetFileName(customer.Avatar).Equals(MediaDefaults.DefaultAvatarFileName))

                    {

                        var oldAvatarAbsolutePath = _nopFileProvider.GetAbsolutePath(MediaDefaults.DefaultAvatarDirectory, _nopFileProvider.GetFileName(customer.Avatar));

                        _nopFileProvider.DeleteFile(oldAvatarAbsolutePath);

                    }

                    var filename = Guid.NewGuid().ToString() + _nopFileProvider.GetFileExtension(model.FormFile.FileName);

                    var newAvatarAbsolutePath = _nopFileProvider.GetAbsolutePath(MediaDefaults.DefaultAvatarDirectory, filename);

                    using FileStream fileStream = new FileStream(newAvatarAbsolutePath, FileMode.Create);

                    await model.FormFile.CopyToAsync(fileStream);

                    customer.Avatar = "/images/Avatar/" + filename;

                }

                var currentRoleIds = (await _customerService.GetRolesAsync(customer,true)).Select(role => role.Id).ToArray();

                foreach (var role in allRoles)

                {

                    if (model.SelectedRoleIds.Contains(role.Id))

                    {

                        if(role.Name== CustomerDefaults.AdministratorsRoleName)

                            customer.IsSystemAccount = true;

                        //把用户所属角色持久化到用户角色映射表中。

                        if (currentRoleIds.All(roleId => roleId != role.Id))

                            await _customerService.AddCustomerRoleMappingAsync(new CustomerRoleMapping { CustomerId = customer.Id, RoleId = role.Id });

                    }

                    else

                    {

                       if (role.Name == CustomerDefaults.AdministratorsRoleName)

                            customer.IsSystemAccount = false;

                        //把用户不属角色从用户角色映射表中删除。

                        if (currentRoleIds.Any(roleId => roleId == role.Id))

                            await _customerService.RemoveCustomerRoleMappingAsync(customer, role);

                    }

                }

                await _customerService.UpdateCustomerAsync(customer);

                ViewBag.RefreshPage = true;

            }

            model = await _customerModelFactory.PrepareCustomerModelAsync(model, customer, true);

            return View(model);

        }

3 Web\Areas\Admin\Views\Customer\Edit.cshtml

@model Web.Areas.Admin.Models.Customers.CustomerModel

@{

    ViewData["Title"] = "Edit";

    Layout = "~/Areas/Admin/Views/Shared/_LayoutPopup.cshtml";

}

@section styles

 {

    rel="stylesheet" href="~/lib/bootstrap-fileinput-5.5.2/css/fileinput.css" />

    href="~/lib/bootstrap-fileinput-5.5.2/themes/explorer-fa5/theme.css" media="all" rel="stylesheet" type="text/css" />

   

 }

@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="Edit"

                          asp-route-btnId="@Context.Request.Query["btnId"]" enctype="multipart/form-data" method="post">

                        class="card-body">

                            class="d-none">

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

                           

                          class="mb-3">

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

                                @if (Model.Username == CustomerDefaults.DefaultSystemCustomer)

                                {

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

                                }

                                else

                                {

                                    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="Phone" class="control-label">

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

                                asp-validation-for="Phone" 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">

                                class="form-check-label">

                                    @if (Model.Username == CustomerDefaults.DefaultSystemCustomer)

                                    {

                                        class="form-check-input checkBox25" asp-for="Active" onclick="return false;" checked />

                                    }

                                    else

                                    {

                                        class="form-check-input checkBox25" asp-for="Active" />

                                    }

                                    class="checkBox25Label">

                                        @Html.DisplayNameFor(model => model.Active)

                                   

                               

                           

                            class="mb-3">

                                class="form-check-label">

                                    @if (Model.Username == CustomerDefaults.DefaultSystemCustomer)

                                    {

                                        class="form-check-input checkBox25" asp-for="Deleted" onclick="return false;" />

                                    }

                                    else

                                    {

                                        class="form-check-input checkBox25" asp-for="Deleted" />

                                    }

                                    class="checkBox25Label">

                                        @Html.DisplayNameFor(model => model.Deleted)

                                   

                               

                           

                            class="mb-3">

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

                                @if (Model.Username == CustomerDefaults.DefaultSystemCustomer)

                                {

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

                                }

                                else

                                {

                                    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="mb-3 text-center">

                             

                                    class="kv-avatar">

                                        class="file-loading">

                                            asp-for="FormFile" type="file" class="file" />

                                       

                                   

                                 

                           

                         

                       

                        class="card-footer text-center">

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

                       

                   

               

           

       

   

@section Scripts {

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

    src="~/lib/bootstrap-fileinput-5.5.2/js/fileinput.js">

    src="~/lib/bootstrap-fileinput-5.5.2/themes/fa5/theme.js" type="text/javascript">

    src="~/lib/bootstrap-fileinput-5.5.2/js/locales/zh.js">

   

}

    对以上功能更为具体实现和注释见:230612_025ShopRazor(用户编辑与bootstrap-fileinput头像上传)。

你可能感兴趣的:(.Net7,MVC,头像上传)