Question

I've researched this a bit and haven't found an answer that quite deals with a similar situation or MVC3. In the ViewModel I'm using I have a Lists of a separate model (List<AgentId> which is a list of the AgentId model).

In the Create page for this controller, I need an input section for 5 items to be added to this list. However, before the page even load, I receive this error message:

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'BankListAgentId[0].StateCode'.

Here is the ViewModel I am using:

public class BankListViewModel
{
    public int ID { get; set; }
    public string ContentTypeID1 { get; set; }
    public string CreatedBy { get; set; }
    public string MANonresBizNY { get; set; }
    public string LastChangeOperator { get; set; }
    public Nullable<System.DateTime> LastChangeDate { get; set; }

    public List<BankListAgentId> BankListAgentId { get; set; }
    public List<BankListStateCode> BankListStateCode { get; set; }
}

And here is the section of the view that's having the issues:

<fieldset>
    <legend>Stat(s) Fixed</legend>
    <table>
    <th>State Code</th>
    <th>Agent ID</th>
    <th></th>
       <tr>
        <td>
            @Html.DropDownListFor(model => model.BankListAgentId[0].StateCode, 
            (SelectList)ViewBag.StateCode, " ")
        </td>
        <td>
            @Html.EditorFor(model => model.BankListAgentId[0].AgentId)
            @Html.ValidationMessageFor(model => model.BankListAgentId[0].AgentId)
        </td>
      </tr>
      <tr>
        <td>
            @Html.DropDownListFor(model => model.BankListAgentId[1].StateCode,
            (SelectList)ViewBag.StateCode, " ")
        </td>
        <td>
            @Html.EditorFor(model => model.BankListAgentId[1].AgentId)
            @Html.ValidationMessageFor(model => model.BankListAgentId[1].AgentId)
        </td>
        <td id="plus2" class="more" onclick="MoreCompanies('3');">+</td>
      </tr>
    </table>
</fieldset>
Was it helpful?

Solution 2

This error wound up being thrown because the ViewBag element I was using had the same name as one of the list item properties.

The solution was to change ViewBag.StateCode to ViewBag.StateCodeList.

OTHER TIPS

I believe @Html.DropDownListFor() is expecting an IEnumerable<SelectListItem>, you can bind it the following way:

In your ViewModel:

public class BankListViewModel
{
    public string StateCode { get; set; }

    [Display(Name = "State Code")]
    public IEnumerable<SelectListItem> BankListStateCode { get; set; }

    // ... other properties here
}

In your Controller load the data:

[HttpGet]
public ActionResult Create()
{
    var model = new BankListViewModel()
    {
        // load the values from a datasource of your choice, this one here is manual ...
        BankListStateCode = new List<SelectListItem>
        {
            new SelectListItem
            {
                Selected = false,
                Text ="Oh well...",
                Value="1"
            }
        }
    };

    return View("Create", model);
}

And then in the View bind it:

 @Html.LabelFor(model => model.BankListStateCode)
 @Html.DropDownListFor(model => model.StateCode, Model.BankListStateCode)

I hope this helps. Let me know if you nee clarifications.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top