6 messaggi dal 05 gennaio 2011
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 :-)
6 messaggi dal 05 gennaio 2011
Sto studiando gli ottimi tutorials su questo sito.. http://tutorials.aspitalia.com/ASP.NET-MVC/
6 messaggi dal 05 gennaio 2011
Grazie lo stesso ;-)
98 messaggi dal 13 febbraio 2016
Ciao Rei66,
hai risolto il problema?
Per recuperare il valore dell'elemento selezionato devi aggiungere nel model UserCreateModel una proprietà di tipo stringa Ruolo che corrisponderà all'elemento selezionato.
Dopo nella view usi questa proprietà per definire l'ID, così:
   <div>
        @Html.DropDownListFor(m => m.Ruolo,
                  new SelectList(Model.Roles,
                               "Value", "Text"))
    </div>


e nel controller, nell'ActionResult POST recuperi il suo valore così:
[HttpPost]
        public ActionResult Index(UserCreateModel user)
        {
            if (ModelState.IsValid)
            {
                string ruolo = user.Ruolo.ToString();

                // ...
            }
        }


Ciao
Paolo
6 messaggi dal 05 gennaio 2011
Grazie Paolo, mi hai tolto un mal di testa.. Incredibile come era semplice.. Credevo che bastasse l'insieme Ruoli e poi dal model andare a "beccare" la voce selezionata. Invece aggiungendo una var nel model che contiene il valore selezionato e nella view passarlo all'helper e il gioco è fatto. Ora approfitto della tua gentilezza (a buon rendere naturalmente) : Nel caso molto probabile che debba prendere dei dati esistenti e riproporli nella view, mi basta passare un model con le property già popolate dai valori del DBContext anziché vuote, e la dropdownlist mostrerà l'item che gli passo? Oppure devo fare qualcos'altro?
Grazie infinite.. continuo a studiare, mi manca il tempo per lo studio ma come vedi basta sapere i concetti che stanno alla base per poter andare avanti velocemente.. Grazie ancora, gentilissimo.
98 messaggi dal 13 febbraio 2016
No, ovvio è che se passi un model già con i dati ti troverai i vari controlli input già popolati.
Usando sempre quel model, nell'ActionResult GET puoi già passare l'elemento "selected":

public ActionResult Index()
        {
            UserCreateModel model = new UserCreateModel();            
            model.Ruolo = "9a314974-d280-4071-a4d4-63f58a9c0852";
            return View(model);
        }


Ciao
Paolo
6 messaggi dal 05 gennaio 2011
Perfetto, come immaginavo, grazie ;-)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.