ASP.NET MVC下拉列表

时间:2009-04-25 16:44:49

标签: asp.net-mvc

有人可以向我发一篇文章,其中显示了从linq到sql(正在设置的文本和值)填充的下拉列表。

由于 丹尼

4 个答案:

答案 0 :(得分:9)

现在HtmlHelper扩展名为IEnumerable<SelectListItem>,我不创建SelectList,但通常只使用LINQ创建SelectListItems。

<强>控制器

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

查看

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

或者如果我想要默认选择

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

编辑

关于下拉列表的一个有趣的地方是,您需要提供一系列值,从中选择适合您实际数据模型的单个值。我通常通过视图数据提供范围(菜单项),并期望在发布页面时返回模型值。如果您还需要强类型菜单,则需要提供一个仅包含视图的模型来封装您的实际模型和任何菜单。这将涉及在发布时使用前缀来标识模型元素。在我看来,权衡是对帖子的简单模型绑定与在视图中使用强类型菜单。我没有挂在后者上,所以我选择不把我的菜单放在模型中。但是,如果你想这样做,它可能如下所示。

<强>模型

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

<强>控制器

显示操作

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

...
return View(model);

制作行动

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

查看

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

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

答案 1 :(得分:5)

以下是Rob Connery

的一篇精彩文章

控制器代码

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

查看标记

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

答案 2 :(得分:0)

如果您需要在标签中添加html属性,这将是一种方法。 将模型传递给您的View e.i. “返回视图(someModel)”然后在视图中:

        <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是您的模型中的属性,如下所示:

public IEnumerable GroupsDropDown {get;组; }

答案 3 :(得分:0)

在视图中写道:

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

}

你可以参考它:

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

您还可以选择特定的行:

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>