Foreach to return Model.Roles does not work with null link exception

I am trying to implement roles in an EF application. I work on all types of forests (Create, Delete, Details), but it’s hard for me to get an idea Editfor the work.

The method GETreturns the data in order (for example, when I go to the edit page, I see the roles correctly):

enter image description here However, if I make changes and save it, I get an error message:

​​ .
47: @Html.Label( "", {@class= "control-label col-md-2" })
48: span class= "col-md-10" >
49: @foreach ( var Model.RolesList)
50: {
51: input type = "checkbox" name= "SelectedRole" value = "@item.Value"
 checked = "@item.Selected" class= "checkbox-inline" /" >

GET Post :

//
// GET: /Users/Edit/1
public async Task<ActionResult> Edit(string id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    var user = await UserManager.FindByIdAsync(id);
    if (user == null)
    {
        return HttpNotFound();
    }

    var userRoles = await UserManager.GetRolesAsync(user.Id);

    return View(new EditUserViewModel()
    {
        Id = user.Id,
        Email = user.Email,
        Username = user.UserName,
        FirstName = user.FirstName,
        LastName = user.LastName,

        RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
        {
            Selected = userRoles.Contains(x.Name),
            Text = x.Name,
            Value = x.Name
        })

    });
}

//
// POST: /Users/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit([Bind(Include = "Email,Id,Username,FirstName,LastName")] EditUserViewModel editUser, params string[] selectedRole)
{
    if (ModelState.IsValid)
    {
        var user = await UserManager.FindByIdAsync(editUser.Id);
        if (user == null)
        {
            return HttpNotFound();
        }

        user.UserName = editUser.Username;
        user.Email = editUser.Email;
        user.FirstName = editUser.FirstName;
        user.LastName = editUser.LastName;

        var userRoles = await UserManager.GetRolesAsync(user.Id);

        selectedRole = selectedRole ?? new string[] { };

        var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(userRoles).ToArray<string>());

        if (!result.Succeeded)
        {
            ModelState.AddModelError("", result.Errors.First());
            return View();
        }
        result = await UserManager.RemoveFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToArray<string>());

        if (!result.Succeeded)
        {
            ModelState.AddModelError("", result.Errors.First());
            return View();
        }
        return RedirectToAction("Index");
    }
    ModelState.AddModelError("", "Something failed.");
    return View();
}

"" :

<div class="form-group">
    @Html.Label("Roles", new { @class = "control-label col-md-2" })
    <span class="col-md-10">
        @foreach (var item in Model.RolesList)
        {
            <input type="checkbox" name="SelectedRole" value="@item.Value" checked="@item.Selected" class="checkbox-inline" />
            @Html.Label(item.Value, new { @class = "control-label" })
        }
    </span>
</div>

rolemanager, :

private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager
{
    get
    {
        return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
    }
    private set
    {
        _roleManager = value;
    }
}

Startup.auth:

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

, rolemanager , Create Details. ,

@foreach (var item in Model.RolesList)

?

+4
2

,

, ModelState.

return View(editUser);

# 6 , null-conditional operator, null reference exception on

@foreach (var item in Model?.RolesList)

" ​​ ." ModelState.IsValid [HttpPost], , ModelState.IsValid . , , return View();. null Model. , , foreach (var item in Model.RolesList)

, , ModelState,

+1

Edit [HttpPost] :

return View();

return View(editUser);

, , editUser selectedRole, ( ) .

EditUserViewModel, Get.

+1

Source: https://habr.com/ru/post/1683481/


All Articles