I am using a radio button among selectable option. Though when I go to an edit view the value of the selected option is not binding to the radio button. It is possible that I have the code wrong, but I am working it the same way as the checkboxes that I am also using on the page, and they work correctly.
Here is my model that I am working with:
public class FactionViewModel { public FactionViewModel() { this.FactionNames = new FactionNamesListViewModel(); this.ReputationTypes = new List<ReputationTypeNamesListViewModel>(); this.ReputationLevels = new List<ReputationLevelNamesListViewModel>(); } public FactionNamesListViewModel FactionNames { get; set; } [Required] [Display(Name = "Reputation Type to be associated with Faction")] public int ReputationTypesID { get; set; } public List<ReputationTypeNamesListViewModel> ReputationTypes { get; set; } [Required] [Display(Name = "Reputation Levels that apply to the Faction")] public List<ReputationLevelNamesListViewModel> ReputationLevels { get; set; } } public class ReputationTypeNamesListViewModel { public int ReputationTypeID { get; set; } public string ReputationTypeName { get; set; } public bool IsSelected { get; set; } }
Here is my controller:
// GET: Factions/Edit/5 public async Task<IActionResult> Edit(int? id) { if (id == null) { return BadRequest(); } var eFaction = new FactionViewModel() { FactionNames = await _db.Database.SqlQuery<FactionNamesListViewModel>(sql: "SELECT Faction_ID AS FactionID, Faction_Name AS FactionName FROM Faction WHERE Faction_ID = @p0", parameters: new object[] { id }).FirstOrDefaultAsync(), ReputationTypes = await _db.Database.SqlQuery<ReputationTypeNamesListViewModel>(sql: "SELECT Reputation_Type_ID AS ReputationTypeID, Reputation_Type_Name AS ReputationTypeName, CAST (CASE WHEN Reputation_Type_ID IN (SELECT ReputationTypeReputation_Type_ID FROM Faction WHERE Faction_ID = @p0) THEN 1 ELSE 0 END AS bit) AS IsSelected FROM ReputationType", parameters: new object[] { id }).ToListAsync(), ReputationLevels = await _db.Database.SqlQuery<ReputationLevelNamesListViewModel>(sql: "GetRepLevelList @p0", parameters: new object[] { id }).ToListAsync() }; if (eFaction == null) { return NotFound(); } return View(eFaction); }
Here is the view:
@* For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 *@ @{ ViewBag.Title = "Edit"; Layout = "~/Views/Shared/_GameDataLayout.cshtml"; } @model Lotro.WebAppMVC.Models.FactionViewModels.FactionViewModel <h2>Edit</h2><form asp-controller="Factions" asp-action="Edit" method="post"><div class="form-horizontal"><h4>Class</h4><hr /><div asp-validation-summary="All" class="text-danger"></div><div class="form-group"><label asp-for="@Model.FactionNames.FactionName" class="control-label col-md-2"></label><div class="col-md-10"><input asp-for="@Model.FactionNames.FactionName" class="form-control" /></div></div><div class="form-group"><label asp-for="@Model.ReputationTypesID" class="control-label col-md-12" style="text-align:center"></label><div class="col-md-12"> @for (var i = 0; i < @Model.ReputationTypes.Count; i++) {<div class="col-md-2"><input type="hidden" asp-for="@Model.ReputationTypes[i].ReputationTypeID" /><input type="radio" asp-for="@Model.ReputationTypes[i].IsSelected" value="@Model.ReputationTypes[i].ReputationTypeID"/><b>@Html.DisplayFor(model => model.ReputationTypes[i].ReputationTypeName)</b></div> }</div></div><div class="form-group"><label asp-for="@Model.ReputationLevels" class="control-label col-md-12" style="text-align:center"></label><div class="col-md-12"> @{ int j = 0; } @for (var i = 0; i < Model.ReputationLevels.Count; i++) {<input type="hidden" asp-for="@Model.ReputationLevels[i].ReputationLevelID" /><div class="col-md-1"><input type="checkbox" asp-for="@Model.ReputationLevels[i].IsChecked" /></div><div class="col-md-2 pull-col-md-1"> @Html.DisplayFor(model => model.ReputationLevels[i].ReputationLevelName)</div> j++; if (j == 4) {<div class="col-md-12"><br /></div> j = 0; } else { continue; } }</div></div><div class="form-group"><div class="col-md-offset-2 col-md-10"><input type="submit" value="Create" class="btn btn-default" /></div></div></div><div><a asp-action="Index">Back to List</a></div></form>
This is what the output of the view is on the page:
<div class="form-group"><label class="control-label col-md-12" style="text-align:center" for="ReputationTypesID">Reputation Type to be associated with Faction</label><div class="col-md-12"><div class="col-md-2"><input name="ReputationTypes[0].ReputationTypeID" id="ReputationTypes_0__ReputationTypeID" type="hidden" value="1" data-val-required="The ReputationTypeID field is required." data-val="true"><input name="ReputationTypes[0].IsSelected" id="ReputationTypes_0__IsSelected" type="radio" value="1" data-val-required="The IsSelected field is required." data-val="true"><b>Crafting</b></div><div class="col-md-2"><input name="ReputationTypes[1].ReputationTypeID" id="ReputationTypes_1__ReputationTypeID" type="hidden" value="2" data-val-required="The ReputationTypeID field is required." data-val="true"><input name="ReputationTypes[1].IsSelected" id="ReputationTypes_1__IsSelected" type="radio" value="2" data-val-required="The IsSelected field is required." data-val="true"><b>Drinking</b></div><div class="col-md-2"><input name="ReputationTypes[2].ReputationTypeID" id="ReputationTypes_2__ReputationTypeID" type="hidden" value="3" data-val-required="The ReputationTypeID field is required." data-val="true"><input name="ReputationTypes[2].IsSelected" id="ReputationTypes_2__IsSelected" type="radio" value="3" data-val-required="The IsSelected field is required." data-val="true"><b>Dwarves</b></div><div class="col-md-2"><input name="ReputationTypes[3].ReputationTypeID" id="ReputationTypes_3__ReputationTypeID" type="hidden" value="4" data-val-required="The ReputationTypeID field is required." data-val="true"><input name="ReputationTypes[3].IsSelected" id="ReputationTypes_3__IsSelected" type="radio" value="4" data-val-required="The IsSelected field is required." data-val="true"><b>Elves</b></div><div class="col-md-2"><input name="ReputationTypes[4].ReputationTypeID" id="ReputationTypes_4__ReputationTypeID" type="hidden" value="5" data-val-required="The ReputationTypeID field is required." data-val="true"><input name="ReputationTypes[4].IsSelected" id="ReputationTypes_4__IsSelected" type="radio" value="5" data-val-required="The IsSelected field is required." data-val="true"><b>Men</b></div><div class="col-md-2"><input name="ReputationTypes[5].ReputationTypeID" id="ReputationTypes_5__ReputationTypeID" type="hidden" value="6" data-val-required="The ReputationTypeID field is required." data-val="true"><input name="ReputationTypes[5].IsSelected" id="ReputationTypes_5__IsSelected" type="radio" value="6" data-val-required="The IsSelected field is required." data-val="true"><b>Other</b></div></div></div>
Also looking at the output from Visual Studio when debugging I see the following:
[0] {Lotro.WebAppMVC.Models.ReputationTypesViewModel.ReputationTypeNamesListViewModel} IsSelected: false ReputationTypeID: 1 ReputationTypeName: "Crafting" [1] {Lotro.WebAppMVC.Models.ReputationTypesViewModel.ReputationTypeNamesListViewModel} IsSelected: true ReputationTypeID: 2 ReputationTypeName: "Drinking" [2] {Lotro.WebAppMVC.Models.ReputationTypesViewModel.ReputationTypeNamesListViewModel} IsSelected: false ReputationTypeID: 3 ReputationTypeName: "Dwarves" [3] {Lotro.WebAppMVC.Models.ReputationTypesViewModel.ReputationTypeNamesListViewModel} IsSelected: false ReputationTypeID: 4 ReputationTypeName: "Elves" [4] {Lotro.WebAppMVC.Models.ReputationTypesViewModel.ReputationTypeNamesListViewModel} IsSelected: false ReputationTypeID: 5 ReputationTypeName: "Men" [5] {Lotro.WebAppMVC.Models.ReputationTypesViewModel.ReputationTypeNamesListViewModel} IsSelected: false ReputationTypeID: 6 ReputationTypeName: "Other"
So it is only getting 1 true value. If I look at the checkboxes on the page they display correctly. So I am not sure where it is I went wrong, the radio button code and checkbox code should work the same.