Ciao buongiorno, chiedo scusa se scrivo questo post banale per molti di voi, ma sono giorni che cerco di venirne a capo e non riesco a farlo. Ho seguito le videolezioni di Fabio Camuso e sto studiando NVC. Ho creato una piccola app dove faccio i miei "esperimenti" e mi sono imbattuto in questo problema : Ho una classe model dove definisco le varie property di un oggetto User, la classe in questione serve solo per creare un nuovo utente:
public class UserCreateModel
{
public UserCreateModel()
{
Roles = new List<SelectListItem>();
Roles.Add(new SelectListItem { Text = "Amministratore", Value = "a2e15850-7bc8-44d8-b397-a9d771053f01" });
Roles.Add(new SelectListItem { Text = "Utente", Value = "9a314974-d280-4071-a4d4-63f58a9c0852", Selected = true });
Roles.Add(new SelectListItem { Text = "Ospite", Value = "2b1ea16f-4132-4566-95f6-5c5446d8aa3a" });
}
[Required]
[Display(Name = "Ruolo")]
public List<SelectListItem> Roles { get; set; }
[Required]
[StringLength(150, ErrorMessage = "Username troppo lungo (Max 20 caratteri)")]
[Display(Name = "Nome Completo")]
public string Username { get; set; }
nella view :
@model EasyBuilding.Models.UserCreateModel
@{
ViewBag.Title = "Register";
}
<h2>Register</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(false);
<div>@Html.LabelFor(m => m.Email)</div>
<div>
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
</div>
<div>@Html.LabelFor(m => m.Username)</div>
<div>
@Html.TextBoxFor(m => m.Username)
@Html.ValidationMessageFor(m => m.Username)
</div>
<div>@Html.LabelFor(m => m.Roles)</div>
<div>
@Html.DropDownListFor(m => m.Roles,
new SelectList(Model.Roles,
"Value", "Text"))
</div>
..non la faccio lunga.. quindi quando vado a registrare un nuovo utente.. nel controller:
public ActionResult Register(UserCreateModel user, string roles)
{
// string roles contiene il guid dell'utente che mi serve (dropdownList Value dell'item selezionato...
if (ModelState.IsValid)
{
using (DatabaseContext db = new DatabaseContext())
{
// codice per registrare nuovo utente...
db.SaveChanges();
}
}
return RedirectToAction("Index", "Home");
}
Ho aggiunto io il secondo parametro string roles alla firma del metodoche cotiene il valore (guid) dell'item selezionato nella dropdownlist.
il problema è che mi aspettavo che nella classe model passata al controller avessi sia l'insieme Roles che il singolo valore dell'item selezionato nella dropdown. Nel Roles (model) c'è tutto l'insieme e naturalmente la Model.IsValid è false perchè c'è un problema di conversione dei tipi.
Come faccio a prendere solo quel valore che mi serve ovvero il value dell'item selezionato nella dropdownlist?
Ho provato anche a mettere tutti valori singoli nella firma del metodo Register, funziona, ma così facendo perdo l'automatismo di controllo MVC e poi se aggiungo un campo devo interrompere il contratto del metodo , insomma non mi pare un buon approccio, preferisco di gran lunga passare la classe Model che "sa" già tuttoe si comporta di conseguenza.
Mi sto perdendo in un biccher d'acqua< lo so, data la mia inesperienza su MVC, ma se qualcuno potesse farmi un esempio semplice semplice in modo che possa capire il meccanismo ve ne sarei grato..
Ringrazio tutti anticipatamente. (Avete da consigliarmi un buon manuale? possibilmente in italiano :-)