Defining a select list through controller and view model

Posted by Ibrar Hussain on Stack Overflow See other posts from Stack Overflow or by Ibrar Hussain
Published on 2013-10-25T15:19:35Z Indexed on 2013/10/25 21:54 UTC
Read the original article Hit count: 167

Filed under:
|

I have a View Model that looks like this:

public class SomeViewModel
{
    public SomeViewModel(IEnumerable<SelectListItem> orderTemplatesListItems)
    {
        OrderTemplateListItems = orderTemplatesListItems;
    }

    public IEnumerable<SelectListItem> OrderTemplateListItems { get; set; }
}

I then have an Action in my Controller that does this:

    public ActionResult Index()
    {   
        var items = _repository.GetTemplates();
        var selectList = items.Select(i => new SelectListItem { Text = i.Name, Value = i.Id.ToString() }).ToList();

        var viewModel = new SomeViewModel
            {
                OrderTemplateListItems = selectList
            };

        return View(viewModel);
    }

Lastly my view:

@Html.DropDownListFor(n => n.OrderTemplateListItems, new SelectList(Model.OrderTemplateListItems, "value", "text"), "Please select an order template")

The code works fine and my select list populates wonderfully. Next thing I need to do is set the selected value that will come from a Session["orderTemplateId"] which is set when the user selects a particular option from the list.

Now after looking online the fourth parameter should allow me to set a selected value, so if I do this:

@Html.DropDownListFor(n => n.OrderTemplateListItems, new SelectList(Model.OrderTemplateListItems, "value", "text", 56), "Please select an order template")

56 is the Id of the item that I want selected, but to no avail. I then thought why not do it in the Controller?

As a final attempt I tried building up my select list items in my Controller and then passing the items into the View:

  public ActionResult Index()
  {   
      var items = _repository.GetTemplates();
      var orderTemplatesList = new List<SelectListItem>();

  foreach (var item in items)
  {
      if (Session["orderTemplateId"] != null)
      {
          if (item.Id.ToString() == Session["orderTemplateId"].ToString())
          {
              orderTemplatesList.Add(new SelectListItem { Text = item.Name, Value = item.Id.ToString(), Selected = true });
          }
          else
          {
              orderTemplatesList.Add(new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
          }
      }
      else
      {
          orderTemplatesList.Add(new SelectListItem { Text = item.Name, Value = item.Id.ToString() });
      }
  }

  var viewModel = new SomeViewModel
      {
          OrderTemplateListItems = orderTemplatesList
      };

  return View(viewModel);
  }

Leaving my View like so:

@Html.DropDownListFor(n => n.OrderTemplateListItems, new SelectList(Model.OrderTemplateListItems, "value", "text"), "Please select an order template")

Nothing!

Why isn't this working for me?

© Stack Overflow or respective owner

Related posts about c#

Related posts about Razor