尝试在新用户创建时添加特定角色,但要获得system.nullreference exception。

发布于 2025-02-04 09:36:00 字数 5794 浏览 2 评论 0原文

我正在尝试在新员工创建时添加特定的角色。但是在create.cshtml选择标签上遇到此错误。我将.NET 6 MVC与本地SQLServer一起使用。

该申请中的角色是管理员,员工和人类资源。

这是图像

System.NullReferenceException: 'Object reference not set to an instance of an object.'

Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>.Model.get returned null.

这是我的代码 [EmployeeViewModel.cs]

public class EmployeeViewModel
{
    public string Id { get; set; }
    [Display(Name = "Username")]
    public string UserName { get; set; }

    [Display(Name = "Email Address")]
    public string Email { get; set; }

    [Display(Name = "First Name")]
    public string Firstname { get; set; }

    [Display(Name = "Last Name")]
    public string Lastname { get; set; }

    public IEnumerable<SelectListItem>? UserRoles { get; set; }

    [Display(Name = "Roles")]
    [Required]
    public string? RoleName { get; set; }
}

[amployeeecontroller.cshtml]

public class EmployeeController : Controller
    {
        private readonly UserManager<Employee> _userManager;
        private readonly RoleManager<IdentityRole> _roleManager;
        private readonly IMapper _mapper;

        public EmployeeController(UserManager<Employee> userManager, 
            RoleManager<IdentityRole> roleManager, IMapper mapper)
        {
            _userManager = userManager;
            _roleManager = roleManager;
            _mapper = mapper;
        }

// GET: EmployeeController/Create
        public ActionResult Create()
        {
            // Displaying user role except Admin Role on select Tag
            IEnumerable<SelectListItem> roles = _roleManager.Roles.AsNoTracking()
                .Where(n=>n.Name != Roles.Admin.ToString())
                .Select(n=>new SelectListItem()
                    {
                        Value = n.Id, Text = n.Name
                    }).ToList();

            var employeeViewModel = new EmployeeViewModel()
            {
                UserRoles = roles
            };
            return View(employeeViewModel);
        }

        // POST: EmployeeController/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(EmployeeViewModel model)
        {
            try
            {
                var employee = _mapper.Map<Employee>(model); // used AutoMapper to map data from employee view model to Employee entity
                string defaultPassword = "123Pa$$word."; // default password at the time first User creation
                var result = await _userManager.CreateAsync(employee, defaultPassword);
                if (! result.Succeeded)
                {
                    ModelState.AddModelError("", "Employee is not Created");
                    return View(model);
                }

                var role =  _roleManager.FindByIdAsync(model.RoleName).Result;
                var roleResult = await _userManager.AddToRoleAsync(employee, role.Name);
                if(! roleResult.Succeeded)
                {
                    ModelState.AddModelError("", "Employee Role is not Created");
                    return View(model);
                }

                return RedirectToAction(nameof(Index));
            }
            catch
            {
                ModelState.AddModelError("", "Employee is not Created for exception");
                return View();
            }
        }
}

[creat.cshtml]

@model LeaveManagement.ViewModels.EmployeeViewModel

@{
    ViewData["Title"] = "Create Employee ";
}

<h2>Create Employee</h2>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create" method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="UserName" class="control-label"></label>
                <input asp-for="UserName" class="form-control" />
                <span asp-validation-for="UserName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Email" class="control-label"></label>
                <input asp-for="Email" class="form-control" />
                <span asp-validation-for="Email" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Firstname" class="control-label"></label>
                <input asp-for="Firstname" class="form-control" />
                <span asp-validation-for="Firstname" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="RoleName" class="control-label"></label>
                <select asp-for="RoleName" asp-items="@Model.UserRoles" class="form-select" ></select>
                <span asp-validation-for="RoleName" class="text-danger"></span>
            </div>
            <div class="form-group mt-2">
                <input type="submit" value="Create" class="btn btn-primary" /> 
                <a asp-action="Index" class="btn btn-primary">Back to index</a>
            </div>
        </form>
    </div>
</div>

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

I am trying to add a specific role at the time of new Employee Creation. But getting this error on create.cshtml select tag. I am using .NET 6 MVC with a local SqlServer.

The roles in the application are Admin, Employee, and HumanResource.

Here is the image

System.NullReferenceException: 'Object reference not set to an instance of an object.'

Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>.Model.get returned null.

Here is my code
[EmployeeViewModel.cs]

public class EmployeeViewModel
{
    public string Id { get; set; }
    [Display(Name = "Username")]
    public string UserName { get; set; }

    [Display(Name = "Email Address")]
    public string Email { get; set; }

    [Display(Name = "First Name")]
    public string Firstname { get; set; }

    [Display(Name = "Last Name")]
    public string Lastname { get; set; }

    public IEnumerable<SelectListItem>? UserRoles { get; set; }

    [Display(Name = "Roles")]
    [Required]
    public string? RoleName { get; set; }
}

[EmployeeController.cshtml]

public class EmployeeController : Controller
    {
        private readonly UserManager<Employee> _userManager;
        private readonly RoleManager<IdentityRole> _roleManager;
        private readonly IMapper _mapper;

        public EmployeeController(UserManager<Employee> userManager, 
            RoleManager<IdentityRole> roleManager, IMapper mapper)
        {
            _userManager = userManager;
            _roleManager = roleManager;
            _mapper = mapper;
        }

// GET: EmployeeController/Create
        public ActionResult Create()
        {
            // Displaying user role except Admin Role on select Tag
            IEnumerable<SelectListItem> roles = _roleManager.Roles.AsNoTracking()
                .Where(n=>n.Name != Roles.Admin.ToString())
                .Select(n=>new SelectListItem()
                    {
                        Value = n.Id, Text = n.Name
                    }).ToList();

            var employeeViewModel = new EmployeeViewModel()
            {
                UserRoles = roles
            };
            return View(employeeViewModel);
        }

        // POST: EmployeeController/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(EmployeeViewModel model)
        {
            try
            {
                var employee = _mapper.Map<Employee>(model); // used AutoMapper to map data from employee view model to Employee entity
                string defaultPassword = "123Pa$word."; // default password at the time first User creation
                var result = await _userManager.CreateAsync(employee, defaultPassword);
                if (! result.Succeeded)
                {
                    ModelState.AddModelError("", "Employee is not Created");
                    return View(model);
                }

                var role =  _roleManager.FindByIdAsync(model.RoleName).Result;
                var roleResult = await _userManager.AddToRoleAsync(employee, role.Name);
                if(! roleResult.Succeeded)
                {
                    ModelState.AddModelError("", "Employee Role is not Created");
                    return View(model);
                }

                return RedirectToAction(nameof(Index));
            }
            catch
            {
                ModelState.AddModelError("", "Employee is not Created for exception");
                return View();
            }
        }
}

[Creat.cshtml]

@model LeaveManagement.ViewModels.EmployeeViewModel

@{
    ViewData["Title"] = "Create Employee ";
}

<h2>Create Employee</h2>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create" method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="UserName" class="control-label"></label>
                <input asp-for="UserName" class="form-control" />
                <span asp-validation-for="UserName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Email" class="control-label"></label>
                <input asp-for="Email" class="form-control" />
                <span asp-validation-for="Email" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Firstname" class="control-label"></label>
                <input asp-for="Firstname" class="form-control" />
                <span asp-validation-for="Firstname" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="RoleName" class="control-label"></label>
                <select asp-for="RoleName" asp-items="@Model.UserRoles" class="form-select" ></select>
                <span asp-validation-for="RoleName" class="text-danger"></span>
            </div>
            <div class="form-group mt-2">
                <input type="submit" value="Create" class="btn btn-primary" /> 
                <a asp-action="Index" class="btn btn-primary">Back to index</a>
            </div>
        </form>
    </div>
</div>

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文