2010-09-02 6 views
1

J'ai été en mesure de créer une liste déroulante pour mon projet MVC, mais la valeur n'est pas sélectionnée comme valeur sélectionnée dans la liste déroulante. Il montre juste la liste entière de comté du premier. La valeur est de la base de données. J'ai essayé de le trouver du post précédent, mais c'était assez déroutant. S'il vous plaît, suggérez-moi pour toute idée.ASP.Net MVC DropdownList et la valeur sélectionnée

code contrôleur

public ActionResult Edit(int i) 
{ 
    var items = new SelectList(db.MST_COUNTRies.ToList(), "COUNTRY_ID", "COUNTRY_NM"); 
    ViewData["MST_COUNTRies"] = items; 
} 

Voir Code

<%= Html.DropDownList("COUNTRY_ID", (SelectList)ViewData["MST_COUNTRies"])%> 
+0

double possible: http://stackoverflow.com/questions/624828/asp-net-mvc-html-dropdownlist-selectedvalue – Gabe

Répondre

6

Je vous suggère d'utiliser une vue fortement typée (pas besoin de ViewData et de chaînes magiques). Comme toujours commencer par définir votre point de vue modèle classe:

public class CountriesViewModel 
{ 
    public int? SelectedCountryId { get; set; } 
    public IEnumerable<SelectListItem> Countries { get; set; } 
} 

Ensuite, votre contrôleur:

public class HomeController : Controller 
{ 
    public ActionResult Index(int? id) 
    { 
     // TODO: Fetch those from your DB 
     var countries = new[] 
     { 
      new { Id = 1, Name = "Country 1" }, 
      new { Id = 2, Name = "Country 2" }, 
     }; 

     var model = new CountriesViewModel 
     { 
      Countries = new SelectList(countries, "Id", "Name", id) 
     }; 

     return View(model); 
    } 
} 

Et enfin votre point de vue fortement typé:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SomeNs.Models.CountriesViewModel>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <%= Html.DropDownListFor(
      x => x.SelectedCountryId, 
      Model.Countries, 
      "-- Select Country --") 
    %> 

</asp:Content> 

Maintenant, lorsque vous appelez /home/index vous obtenez pas pays sélectionné, mais lorsque vous passez le id à cette action comme /home/index/2 vous obtenez le pays avec cet identifiant sélectionné.

Remarque: Si vous utilisez ASP.NET MVC 1.0, vous n'avez pas l'aide DropDownListFor fortement typé et vous pouvez utiliser ceci:

<%= Html.DropDownList(
     "SelectedCountryId", 
     Model.Countries, 
     "-- Select Country --") 
%> 
+0

"TODO: Récupère les données de votre base de données" Est-ce que je récupère des données de ce genre? new SelectList (db.MST_COUNTRies.ToList(), "COUNTRY_ID", "COUNTRY_NM"); " – Hoorayo

+0

Yeap, cela pourrait fonctionner Bien sûr, vous ne devriez pas oublier le dernier paramètre qui définit la valeur sélectionnée:' new SelectList (db.MST_COUNTRies.ToList(), "COUNTRY_ID", "COUNTRY_NM", id); 'Vous devriez également éviter d'accéder directement à la base de données à partir de votre contrôleur, mais en l'extrayant dans un référentiel afin de pouvoir tester vos contrôleurs séparément. Mais ce n'est pas lié à votre question, c'est juste une bonne pratique. –

1

Essayez quelque chose comme ceci:

public ActionResult Edit(int i) 
{ 
    var items = new SelectList(db.MST_COUNTRies.ToList(), "COUNTRY_ID", "COUNTRY_NM", yourSelectedCountryId); 
    ViewData["COUNTRY_ID"] = items; 
} 

Alors à votre avis:

<%= Html.DropDownList("COUNTRY_ID"); %> 

Quelques notes:

  • L'argument « yourSelectedCountryId » dans la nouvelle SelectList() peut être utilisé pour déterminer l'élément qui doit être initialement sélectionné. En supposant que COUNTRY_ID est un int, cet argument devrait aussi être un int.
  • Si vous remplissez ViewData avec un IEnumerable qui correspond au nom/id de DropDownList, l'appel Html.DropDownList() le trouve automatiquement et l'utilise. C'est pourquoi j'ai changé ViewData ["MST_COUNTRies"] en ViewData ["COUNTRY_ID"]. Il enregistre un peu de code, et je me suis trouvé obligé d'utiliser cette approche pour contourner un bug dans MVC v1.
+0

Je les ai changés, mais la même chose s'est encore produite. La valeur de la base de données n'est pas sélectionnée dans la liste déroulante. J'utilise un ViewModel comme "return View (nouveau EducationViewModel (empEducation))". Pensez-vous que cela pourrait être une raison? – Hoorayo

+0

Oui, le ViewModel peut l'affecter. Est-ce que EducationViewModel a également un champ appelé COUNTRY_ID? Si c'est le cas, sa valeur COUNTRY_ID peut remplacer la valeur par défaut du nouvel appel SelectList(), et vous devez le définir sur la valeur de votre base de données pour que mon approche fonctionne. Assurez-vous également que la valeur de la base de données est un ID de pays réel, pas un nom de pays, un objet de type MST_COUNTRY, etc. Il doit s'agir d'un ID correspondant à la propriété COUNTRY_ID des pays que vous transmettez à SelectList. –

Questions connexes