foreach循环中的SelectList

时间:2011-01-14 03:06:04

标签: asp.net-mvc

我在控制器中有以下代码:

    public static IEnumerable<SelectListItem> EventStatus = new[] {
        new SelectListItem{ Text=Active, Value=Active},
        new SelectListItem{ Text=CheckedIn, Value=CheckedIn},
        new SelectListItem{ Text=Inactive, Value=Inactive}
    };

    ViewData["EventStatus"] = EventStatus;

我正在尝试迭代.aspx文件中的foreach循环并将值绑定到SelectList。

<% foreach (var item in Model) { %>
....
<%= Html.DropDownList("item.Status", ViewData["EventStatus"] as SelectList)%>
...

这不起作用。我得到了:

  

没有带键的ViewData项   'item.Status'的类型   '的IEnumerable'。

<%= Html.Encode(item.Status) %>有效。

我也试过这个:

<%= Html.DropDownList("item.Status", (IEnumerable<SelectListItem>)ViewData["EventStatus"])%>

显示列表,但未选择任何内容(不发生绑定)。

有人有任何建议吗?

干杯,

迪安

3 个答案:

答案 0 :(得分:1)

您不必循环将项目绑定到DropDownList或ListBox之类的控件就可以执行此操作

<%= Html.DropDownList("ControlName",  ViewData["EventStatus"] as IEnumerable<SelectListItem>)%>

用于DropDownList并且像这样

 <%= Html.ListBox("ControlName", ViewData["EventStatus"] as IEnumerable<SelectListItem>)%>

for ListBox

答案 1 :(得分:1)

我建议您使用视图模型而不是ViewData。这样您的视图将被强类型化。例如,您可以使用以下视图模型:

public class MyViewModel
{
    public string Status { get; set; }

    public IEnumerable<SelectListItem> EventStatuses
    {
        get
        {
            return new SelectList(new[] 
            {
                new SelectListItem{ Text = Active, Value = Active },
                new SelectListItem{ Text = CheckedIn, Value = CheckedIn },
                new SelectListItem{ Text = Inactive, Value = Inactive }
            }, "Value", "Text");
        }
    }
}

然后在你的控制器中:

public class HomeController: Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        // TODO: Do something with the selected model.Status
        return View(model);
    }
}

最后是强类型视图:

<% using (Html.BeginForm()) { %>
    <%= Html.DropDownListFor(x => x.Status, Model.EventStatuses) %>
    <input type="submit" value="OK" />
<% } %>

答案 2 :(得分:0)

你可以发布更多的控制器吗?您展示的内容不会构建,是实际来源还是您输入?

当视图执行时看起来像ViewData [“EventStatus”]为null。如果你把:

<%= ViewData["EventStatus"] == null %> 

在你看来是真的还是假的?

来自Mvc2 Source(SelectExtensions.SelectInternal):

if (selectList == null) {
            selectList = htmlHelper.GetSelectData(name);
            usedViewData = true;
        }

selectList是传入的列表。正如您所看到的,它是否为null,它会尝试使用“name”(在本例中为“item.Status”)从视图数据中获取值。