tags:

views:

1177

answers:

4

Can someone point me to an article that shows the dropdownlist being populated from linq to sql (text and value being set).

Thanks Danny

+6  A: 

Here's one great article by Rob Connery

Controller Code

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

View Markup

<%=Html.DropDownList("CategoryID")%>
Jose Basilio
You don't need the second argument in the html helper. The method will look that up for you if you just pass the "CategoryID".
çağdaş
@cagdas, Good obsevation +1
Jose Basilio
+8  A: 

Now that the HtmlHelper extension takes an IEnumerable<SelectListItem>, I don't create SelectList's, but usually just create the SelectListItems with LINQ.

Controller

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

View

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

or if I want a default selection

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

EDIT:

The interesting bit about the dropdown list is that you need to supply a range of values from which to select a single value that fits into your actual data model. I typically provide the range (menu items) via view data and expect back the model values when the page is posted. If you wanted strongly-typed menus as well, you'd need to provide a view-only model that encapulates your real model and any menus. This would involve, on posting, the use of prefixes to identify the model elements. The trade-off, to my mind, is simpler model binding on post vs. the use of strongly-typed menus in the view. I'm not hung up on the latter, so I opt not to put my menus in the model. If you wanted to do this, though, it might look like the following.

Model

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

Controller

Display action

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

...
return View(model);

Create action

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

View

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

<%= Html.DropDownList("Category.CategoryID",
                      Model.CategoryMenu,
                      "Select a Category" ) %>
tvanfosson
Thats great. Could you provide an example using this with the ViewModel pattern. Thanks
Danny
A: 

If you need to add html attributes to your tags this would be a way of doing it. Pass a Model to your View e.i. "return View(someModel)" then in the View:

        <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 is a property in your Model like this:

public IEnumerable GroupsDropDown { get; set; }

Javier Figueroa
A: 

i want to save selected values from dropdownlist in edit mode. can u plz tell me how to do that...? here's my code:

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit( Requirements reqToEdit, FormCollection frm)
    {
        try
        {
           // var dropdownlistname= int.Parse(frm["aa"]);

            // TODO: Add update logic here
            var reqInfo = (from r in _db.Requirements
                           where r.ReqId == reqToEdit.ReqId
                           select r).First();
            if (!ModelState.IsValid)
                return View(reqInfo);

             // this is where  i want to get the selected status value from the 
            // dropdownlist and update the object. 
           // reqToEdit.reqStatus =Convert.ToInt32(dropdownlistname); 



            _db.ApplyPropertyChanges(reqInfo.EntityKey.EntitySetName, reqToEdit);
            _db.SaveChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
sudhir