The issue here is that upon submitting the form, the list of UserCustomerClaims
properties 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.