2009-04-25 21 views
7

Kann mir jemand auf einen Artikel verweisen, der die Dropdown-Liste zeigt, die von linq bis sql (Text und Wert wird gesetzt) ​​gefüllt wird.ASP.NET MVC Dropdown-Liste

Dank Danny

Antwort

9

Jetzt, da die HtmlHelper-Erweiterung einen IEnumerable<SelectListItem>-Wert annimmt, erstelle ich keine SelectLists, sondern erstelle normalerweise nur die SelectListItems mit LINQ.

-Controller

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

Ansicht

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

oder wenn ich will eine Standardauswahl

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

EDIT:

Das interessante an der Dropdown-Liste ist, dass Sie eine Reihe von Werten angeben müssen, aus denen Sie einen einzelnen Wert auswählen können, der in Ihr tatsächliches Datenmodell passt. Normalerweise stelle ich den Bereich (Menüelemente) über Ansichtsdaten bereit und erwarte die Modellwerte, wenn die Seite gepostet wird. Wenn Sie auch stark typisierte Menüs möchten, müssen Sie ein reines View-Modell bereitstellen, das Ihr reales Modell und alle Menüs umfasst. Dies würde beim Buchen die Verwendung von Präfixen zur Identifizierung der Modellelemente beinhalten. Der Kompromiss besteht meines Erachtens in der einfacheren Bindung des Modells an die Post und der Verwendung stark typisierter Menüs in der Ansicht. Ich bin nicht auf dem Letzten hängen, also entscheide ich mich, meine Menüs nicht in das Modell zu bringen. Wenn Sie dies jedoch tun wollten, könnte es wie folgt aussehen.

Modell

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

-Controller

Display Aktion

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

... 
return View(model); 

Aktion erstellen

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

Ansicht

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

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

Das ist großartig. Können Sie ein Beispiel mit dem ViewModel-Muster angeben? Vielen Dank – Danny

5

Hier ist ein großer Artikel von Rob Connery

-Controller-Code

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

anzeigen Markup

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

Sie brauchen das zweite Argument im HTML-Helfer nicht. Die Methode sucht das für Sie, wenn Sie nur die "CategoryID" übergeben. –

+0

@ cagdas, Gute Observation +1 –

0

Wenn Sie HTML-Attribute hinzufügen, um Ihre Tags dies ein Weg, es zu tun wäre. Übergeben Sie ein Modell an Ihre Ansicht e.i."Return View (someModel)" dann in der Ansicht:

 <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 ist eine Eigenschaft in Ihrem Modell wie folgt aus:

public IEnumerable GroupsDropDown {get; einstellen; }

0

schreiben in der Ansicht:

@{ 
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); 
} 

}

Sie können es ike verweisen, dass:

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

Sie können auch eine bestimmte Zeile wählen:

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> 
Verwandte Themen