0

The issue here is that upon submitting the form, the list of UserCustomerClaimsproperties in the ApplicationUserEditViewModel object is null; the responses of the check boxes in the for loop are not being or making it to the controller.

View

@model  WaterManagementSystem.Features.Admin.ApplicationUserEditViewModel

@{
  ViewBag.Title = "Edit User";
  Layout = "_Layout";
}

<form asp-action="UpdateUser" asp-controller="Admin" method="post">

    ...
  <div style="color: White;">

  @foreach (var userClaim in Model.UserCustomerClaims)
  { 
    <div>
        <input type="checkbox" asp-for="@userClaim.HasClaim" id="@userClaim.ID" name="@userClaim.ID" checked="@(userClaim.HasClaim)" /> 
        <input type="hidden" asp-for="@userClaim.ID" /> @userClaim.UserClaim.Type
    </div>
  }
  </div>
  <div>
    <div>
      <button type="submit" class="btn btn-default">Save</button>
    </div>
  </div>
</form>

View Model

public class ApplicationUserEditViewModel : ApplicationUserViewModel
{
  ...
  private List<UserCustomerClaim> userCustomerClaims_ = null;

  public ApplicationUserEditViewModel() : this(new ApplicationUser())
  {
    userCustomerClaims_ = new List<UserCustomerClaim>();
  }

  public List<UserCustomerClaim> UserCustomerClaims
  {
    get
    {
      return userCustomerClaims_;
    }
  }


  public class UserCustomerClaim
  {
    public UserCustomerClaim(Claim userClaim, bool hasClaim)
    {
      UserClaim = userClaim;
      HasClaim = hasClaim;
      ID = Guid.NewGuid();
    }

    public Guid ID { get; set; }

    public Claim UserClaim { get; set; }
    public bool HasClaim { get; set; }
  }
}

Controller

[HttpPost]
public async Task<ActionResult> UpdateUser(ApplicationUserEditViewModel vm)
{
  ...
}

The proposed duplicate does not use the asp-for tag helper.

8protons
  • 3,591
  • 5
  • 32
  • 67

0 Answers0