根据第三个变量排序的第二个变量删除项目的下拉列表

时间:2015-01-30 22:25:50

标签: c# asp.net-mvc html.dropdownlistfor

我是C#/ MVC的新手。我有一个包含四个元素的列表(NameID,Name,IsActive和DisplayOrder)。我希望提供一个下拉列表来选择名称,但列表应仅包含IsActive = true的列表,并根据DisplayOrder按顺序显示列表。

在视图中创建我有

@Html.DropDownList("NameID");

在控制器中我有

public ActionResult Create()
    { 
        ViewBag.NameID = new SelectList(db.Names, "NameID", "Name");
        return View();
    }

我想使用类似ViewBag.NameID.Where(IsActive=true)语句的方式将子集/显示顺序信息直接放在.OrderBy(DisplayOrder)行中,但我无法弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:1)

这属于控制器:

var names = db.Names.Where(n => n.IsActive).OrderBy(n => n.DisplayOrder);
var model = new SelectList(names, "NameID", "Name");

return this.View(model);

在相应的视图中,你应该有类似的代码:

@model SelectList

@Html.DropDownList("someName", Model)

由于您使用的模式称为MVC,其中M代表Model,您应该使用模型而不是ViewBag在控制器和视图之间传递数据。

答案 1 :(得分:1)

如果您熟悉LINQ语句,实际上很容易实现。

我已经编写了一些示例代码,可以为您清除所有内容。 (希望)

void Main()
{
    var members = new List<Member>();

    members.Add(new Member() {NameId = 1, Name = "Hank", IsActive = false, DisplayOrder = 3});
    members.Add(new Member() {NameId = 2, Name = "Walter", IsActive = true, DisplayOrder = 2});
    members.Add(new Member() {NameId = 3, Name = "Jimmy", IsActive = true, DisplayOrder = 1});
    members.Add(new Member() {NameId = 4, Name = "Bell", IsActive = false, DisplayOrder = 4});

    var myDropDownMembers = members.Where(m => m.IsActive == true).OrderBy(m => m.DisplayOrder);

    Console.WriteLine(myDropDownMembers);

}

class Member
{
    public Member() {}

    public int NameId;
    public string Name;
    public bool IsActive;
    public int DisplayOrder;
}

结果是,

enter image description here

如果您想熟悉LINQ,请查看这两个教程,不要忘记在MSDN上有一个潜行高峰帮助它,

LINQ Tutorial for Beginners

Understanding LINQ (C#)