Asp.net Mvc如何在不设置控制器中的选定项的情况下使用DropDownListFor

时间:2012-02-19 16:17:56

标签: asp.net-mvc

我有一个包含子模型列表的Parent模型。在视图中,我使用像这样的模板渲染孩子

@Html.EditorFor(model => model.ChildItems)

在子模型模板中,我有这个下拉列表

@Html.DropDownListFor(model => model.Quantity, 
      new SelectList(new[] { 1,2,3,4,5,6,7,8,9,10 }))

但我不知道如何设置所选项目。

我看到的大多数例子都是简单的控制器创建列表,设置选中并传递给视图。

除非我,否则在控制器中执行类似

的操作
ViewBag["Child_1_SelectedItem"] = children[0].Quantity 
ViewBag["Child_2_SelectedItem"] = children[1].Quantity 

我根本没有看到我如何理解这一点。

2 个答案:

答案 0 :(得分:1)

您通常会这样做:

var quantities =  new List<SelectListItem>(new[] {
        new SelectListItem { 
            Selected = true, 
            Text="1",
            Value="1"
        },
        new SelectListItem { 
            Text="2",
            Value="2"
        }
        ....

然后:

@Html.DropDownListFor(model => model.Quantity, quantities)

看起来很烦人,但你可以像这样在控制器上构建它:

var q = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List<SelectListItem> list = new List<SelectListItem>();
foreach (var item in q)
{
    if(children[item].Quantity)// dunno what is in this property...
    {//if Quantity is bool you could directly set Selected then..
      list.Add(new SelectListItem {  Selected = true, Text = item.ToString() });
    } else {
      list.Add(new SelectListItem { Text = item.ToString() });
    }
}

然后将list传递给视图。或者你可以在视图本身的@{..}代码块中执行此操作。

答案 1 :(得分:1)

SelectList构造函数上还有另一个重载,它接受所选项目,所以你几乎就有了第二个代码片段

int[] array = { 1, 2, 3 };
var list = new SelectList(array, 1);

鉴于此,您可以将代码更改为:

@Html.DropDownListFor(model => model.Quantity, 
  new SelectList(new[] { 1,2,3,4,5,6,7,8,9,10 }, model.Quantity))

编辑: 看来你无法访问第一个参数之外的lambda参数(这是有道理的),但你应该能够做到这一点(假设Model与模型的类型相同,有细微差别):

@Html.DropDownListFor(model => model.Id, 
  new SelectList(new[] { 1,2,3,4,5,6,7,8,9,10 }, Model.Id))

或者,使用一个简单的变量:

@{
    int selectedQuantity = Model.Quantity;
}

@Html.DropDownListFor(model => model.Id, 
  new SelectList(new[] { 1,2,3,4,5,6,7,8,9,10 }, selectedQuantity))