Sto avendo una classe come segueselezioni multiple CheckBoxList: difficoltà nel modello legano indietro
public class UserRoleModel
{
public string Role { get; set; }
public bool UserRole { get; set; }
}
e public UserRoleModel[] UserRoles { get; set; }
mio controller è la seguente:
public ActionResult CreateUser()
{
UserDetailsModel model = new UserDetailsModel();
return View(model);
}
[HttpPost]
public ActionResult CreateUser(UserDetailsModel model)
{
return View(model);
}
Dal mio punto di vista sto avendo
>@foreach (var item in Model.UserRoles)
{
name = "UserRoles"+ ".Value["+ i + "]";
id= "UserRoles" + "_Value[" + i++ + "]";
selected = item.UserRole ? "checked=\"checked\"" : "";
<p>
<input type="checkbox" name="@name" id="@id" @selected value="true" />
<label for="@id">@item.Role</label>
<input type="hidden" name="@name" value="false" />
</p>
}
Nonostante i valori visualizzati di conseguenza, secondo la mia vista, non esiste alcun vincolo di modello per UserRoles. Cosa mi manca o esiste un metodo migliore e più pulito?
Una cosa che non ho notato fino a quando non l'ho provata in realtà - il @ Html.EditorFor (x => x.Roles) effettivamente eseguirà l'iterazione attraverso la raccolta. Pulito davvero. – chris
Grande. Questa sembra una buona soluzione per quello che sto cercando (finalmente). Sicuramente lo proverò domani. Non riuscivo a trovare qualcosa che mi soddisfacesse anche su HttpPost; probabilmente stava cercando la cosa sbagliata. La maggior parte delle soluzioni richiedeva un array o un altro parametro aggiuntivo nell'azione HttpPost del controller. Grazie, Darin. – Rodi
Testato ora e funziona anche per la mia situazione. Ma ho modificato 'LabelFor' per usare la stessa proprietà di' CheckBoxFor' in modo che facendo clic sull'etichetta si attiva anche la casella di controllo. In questo esempio sarebbe: '@ Html.LabelFor (x => x.UserRole, Model.Role)' – Rodi