开发者

SelectList within a foreach loop

开发者 https://www.devze.com 2023-02-03 23:27 出处:网络
I have the following code in a controller: public static IEnumerable<SelectListItem> EventStatus = new[] {

I have the following code in a controller:

    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;

I'm trying to iterate through a foreach loop in an .aspx file and binding the value to the SelectList.

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

This isn't working. I'm getting:

There is no ViewData item with the key 'item.Status' of type 'IEnumerable'.开发者_C百科

but <%= Html.Encode(item.Status) %> works.

I also tried this:

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

This displays the list, but nothing is selected (no binding occurs).

Anyone have any suggestions?

Cheers,

Dean


You do not have to loop through to bind item to a control like DropDownList or ListBox just do this

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

for DropDownList and like this

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

for ListBox


I would recommend you to use view models instead of ViewData. This way your views will be strongly typed. For example you could have the following view model:

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");
        }
    }
}

and then in your controller:

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

and finally the strongly typed view:

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


Can you post a bit more of your controller. What you have shown wouldn't build, is it actual source or did u type it in?

It looks like when the view is executing ViewData["EventStatus"] is null. If you put:

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

in your view does it come up true or false?

From Mvc2 Source (SelectExtensions.SelectInternal):

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

selectList is the list that was passed in. As you can see if it is null it attempts to get a value from the view data using the "name" (which in this case is "item.Status").

0

精彩评论

暂无评论...
验证码 换一张
取 消