2009-04-25 8 views
7

Quelqu'un peut-il me diriger vers un article qui montre la liste déroulante étant rempli de linq à sql (texte et valeur en cours de définition).ASP.NET MVC dropdownlist

Merci Danny

Répondre

9

Maintenant que l'extension HtmlHelper prend un IEnumerable<SelectListItem>, je ne crée pas SelectList, mais généralement je crée simplement SelectListItems avec LINQ.

Contrôleur

ViewData["CategoryID"] = categories.Select(c => new SelectListItem 
               { 
                Text = c.CategoryName, 
                Value = c.CategoryID 
               } 
             ); 

Voir

<%= Html.DropDownList("CategoryID") %> 

ou si je veux une sélection par défaut

<%= Html.DropDownList("CategoryID", 
         (IEnumerable<SelectListItem>)ViewData["CategoryID"], 
         "Select a Category") %> 

EDIT:

Le bit intéressant de la liste déroulante est que vous devez fournir une plage de valeurs à partir de laquelle sélectionner une valeur unique qui correspond à votre modèle de données réel. Je fournis généralement la plage (éléments de menu) via les données de vue et attend les valeurs du modèle lorsque la page est publiée. Si vous souhaitez également des menus fortement typés, vous devez fournir un modèle de vue uniquement qui encapsule votre modèle réel et tous les menus. Cela impliquerait, lors de la publication, l'utilisation de préfixes pour identifier les éléments du modèle. Le compromis, à mon avis, est une liaison de modèle plus simple sur le poste que sur l'utilisation de menus fortement typés dans la vue. Je ne suis pas accroché sur ce dernier, donc je choisis de ne pas mettre mes menus dans le modèle. Si vous vouliez faire cela, cependant, cela pourrait ressembler à ceci.

Modèle

public class CategoryViewModel 
{ 
    public Category Category { get; set; } 
    public IEnumerable<SelectListItem> CategoryMenu { get; set; } 
    ... 
} 

Contrôleur

action d'affichage

var model = new CategoryViewModel(); 
model.CategoryMenu = categories.Select(c => new SelectListItem 
               { 
                Text = c.CategoryName, 
                Value = c.CategoryID 
               } 
            ); 

... 
return View(model); 

Créer une action

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create([Bind(Prefix="Category")]Category category) 
{ 
    ... 
} 

Voir

<%= Html.TextBox("Category.Name") %> 

<%= Html.DropDownList("Category.CategoryID", 
         Model.CategoryMenu, 
         "Select a Category") %> 
+0

C'est génial. Pourriez-vous donner un exemple en utilisant ceci avec le pattern ViewModel. Merci – Danny

5

Voici un excellent article par Rob Connery

code contrôleur

NorthwindDataContext db = new NorthwindDataContext(); 
var categories = from c in db.Categories select c; 
ViewData["CategoryID"] = new SelectList(categories, "CategoryID", "CategoryName"); 

Voir Markup

<%=Html.DropDownList("CategoryID")%> 
+1

Vous n'avez pas besoin du second argument dans l'assistant html. La méthode va chercher ça pour vous si vous venez de passer le "CategoryID". –

+0

@cagdas, Bon obsevation +1 –

0

Si vous avez besoin d'ajouter des attributs HTML à vos balises ce serait une façon de le faire. Passez un modèle à votre vue e.i."Return View (SomeModel)", puis dans la vue:

 <select id="Groups" name="Groups"> 
      <% foreach (SelectListItem item in Model.GroupsDropDown) 
       { 
        if (item.Selected) 
        {%> 
         <option selected="selected" title="<%= item.Text %>"> 
          <%= item.Text%></option> 
        <%} 
        else 
        {%> 
         <option title="<%= item.Text %>"> 
          <%= item.Text%></option> 
        <%} %> 
      <% } %> 
     </select> 

GroupsDropDown est une propriété dans votre modèle comme celui-ci:

publique IEnumerable GroupsDropDown {get; ensemble; }

0

Ecrire dans la vue:

@{ 
TaskManagerContext context = new TaskManagerContext(); 

IEnumerable<TestTask1.Models.User> CDrop = context.Users.ToList(); 
List<SelectListItem> selectList = new List<SelectListItem>(); 
foreach (var c in CDrop) 
{ 
    SelectListItem i = new SelectListItem(); 
    i.Text = c.Username.ToString(); 
    i.Value = c.ID.ToString(); 
    selectList.Add(i); 
} 

}

Vous pouvez référencer IKE:

@Html.DropDownListFor(m => m.UserID, 
          new SelectList(selectList, "Value", "Text")); 

Vous pouvez également choisir une ligne spécifique:

TaskManagerContext context = new TaskManagerContext(); 
UsersRepository repo = new UsersRepository(); 
User user = repo.GetAll().FirstOrDefault(u => u.ID == ViewBag.UserId); 
ViewBag.User = user; 

<div><h3><label>@ViewBag.Title1</label>@ViewBag.User.Username</h3></div> 
Questions connexes