2009-06-24 6 views
1

J'ai le problème suivant:Récupération de données à partir de Html.DropDownList() dans le contrôleur (ASP MVC) | chaîne renvoyée?

J'ai un formulaire dans site/banen (actuellement serveur web local) qui utilise une base de données SQL. Le lien est fait à l'aide ADO.net et est instancié dans le contrôleur de la manière suivante:

DBModelEntities _entities; 
_entities = new DBModelEntities(); // this part is in the constructor of the controller. 

Ensuite, j'utiliser cette base pour remplir un Html.DropDownList() à mon avis. C'est fait en deux étapes. Du côté du contrôleur, nous avons dans le constructeur:

ViewData["EducationLevels"] = this.GetAllEducationLevels(); 

et une méthode d'assistance:

public SelectList GetAllEducationLevels() 
{ 
    List<EducationLevels> lstEducationLevels = _entities.EducationLevels.ToList(); 
    SelectList slist = new SelectList(lstEducationLevels, "ID", "Name"); 
    return slist; 
} 

De l'avis que je donne les résultats suivants:

<% using (Html.BeginForm()) {%> 

    <fieldset> 
     <legend>Fields</legend> 

     <!-- various textfields here --> 

     <p> 
      <label for="EducationLevels">EducationLevels:</label> 
      <!-- <%= Html.DropDownList("EducationLevels", ViewData["EducationLevels"] as SelectList)%> --> 
      <%= Html.DropDownList("EducationLevels", "..select option..")%> 
     </p> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 

<% } %> 

Maintenant, la forme est rendue correctement lorsque je navigue sur la page de création. Je peux sélectionner etc. Mais quand je suis sélectionné, je dois utiliser cette valeur pour enregistrer dans mon nouveau modèle à télécharger dans la base de données. C'est là que ça ne va pas. Je le code suivant pour le faire dans mon contrôleur:

// 
    // POST: /Banen/Create 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(FormCollection form) 
    { 
     // set rest of information which has to be set automatically 
     var vacatureToAdd = new Vacatures(); 
     //vacatureToAdd.EducationLevels = form["EducationLevels"]; 

     // Deserialize (Include white list!) 
     TryUpdateModel(vacatureToAdd); 

     // Validate 
     if (String.IsNullOrEmpty(vacatureToAdd.Title)) 
      ModelState.AddModelError("Title", "Title is required!"); 
     if (String.IsNullOrEmpty(vacatureToAdd.Content)) 
      ModelState.AddModelError("Content", "Content is required!"); 

     // Update the variables not set in the form 
     vacatureToAdd.CreatedAt = DateTime.Now;     // Just created. 
     vacatureToAdd.UpdatedAt = DateTime.Now;     // Just created, so also modified now. 
     vacatureToAdd.ViewCount = 0;       // We have just created it, so no views 
     vacatureToAdd.ID = GetGuid();       // Generate uniqueidentifier 

     try 
     { 
      // TODO: Add insert logic here 
      _entities.AddToVacatures(vacatureToAdd); 
      _entities.SaveChanges(); 

      // Return to listing page if succesful 
      return RedirectToAction("Index"); 
     } 
     catch (Exception e) 
     { 
      return View(); 
     } 
    } 
    #endregion 

Il donne l'erreur:

alt text http://www.bastijn.nl/zooi/error_dropdown.png

J'ai trouvé divers sujets sur cela, mais tout dire que vous pouvez récupérer en utilisant simplement:

vacatureToAdd.EducationLevels = form["EducationLevels"]; 

Bien que cela renvoie une chaîne pour moi. Depuis que je suis nouveau sur ASP.net je pense que j'oublie de dire de sélectionner l'objet à retourner et non une chaîne. Peut-être que c'est la valeur selectedValue dans la partie où je fais ma SelectList mais je n'arrive pas à comprendre comment la régler correctement. Bien sûr, je peux aussi être complet sur un side-car.

Sidenote: actuellement je pense à avoir un modèle séparé comme here.

Toute aide est appréciée.

Répondre

1

Vous ne pouvez pas renvoyer un objet à partir de la balise < SELECT habituelle qui est rendue par la méthode Html.DropDownList(), mais seule la variable de chaîne peut être retournée. Dans votre cas, l'ID de l'objet EducationLevels sera envoyé au serveur. Vous devez définir et utiliser une autre méthode d'assistance personnalisée pour reconstruire cet objet par ID.

+0

Merci, je l'ai déjà fait mais je pensais avoir une chaîne étrange retournée. Mais après que vous ayez dit cela, je me suis souvenu que j'obtenais l'identificateur unique comme une chaîne bien sûr. Voilà pourquoi ça a mal tourné. J'attendais un numéro ou un nom, mais j'ai obtenu l'identificateur unique. – bastijn

Questions connexes