如何在控制器创建动作中用状态填充SelectList



我正试图使用MS教程NerdDinner的代码来填充状态下拉,包括任何已经存在的(用于Edit ActionResult)。

以下是在NerdDinner中使用的电话国家:

//ViewData["Countries"] = new SelectList(PhoneValidator.AllCountries, dinner.Country);

我有所有的州,我只是添加了一些来测试。

public ActionResult Create()
{
    Operation operation = new Operation();
    ViewData["States"] = new SelectList(
        new List<SelectListItem>
        {           
             new SelectListItem{ Text="Ohio", Value="OH"},
            new SelectListItem{ Text="Oklahoma", Value="OK"},
            new SelectListItem { Text="Oregon", Value="OR"},
            new SelectListItem{ Text="Pennsylvania", Value="PA"},
            new SelectListItem{ Text="Rhode Island", Value="RI"}
        }, operation.State);

    return View(operation);
}

下面是创建视图中的帮助器(与编辑视图相同):

@Html.DropDownList("States", ViewData["States"] as SelectList))

你有很多问题。首先,您构建SelectListItem的集合(这是DropDownList所需的全部),然后尝试从中制作SelectList。除了无意义的额外开销之外,您没有指定dataValueFielddataTextField参数,因此您生成了一大堆看起来像

的选项
<option>System.Web.Mvc.SelectListItem</option>

和您试图设置所选选项的第二个参数也将不起作用(除非operation.StateSelectListItem的类型)

其次,绑定到的属性和SelectList不能使用相同的名称。您的SelectList应该命名为(例如)StateList

最后,你实际上没有绑定到任何东西。您的模型包含一个名为State的属性,而不是States。总是使用强类型的html帮助。

你的代码应该是
public ActionResult Create()
{
    Operation operation = new Operation();
    ViewData["StateList"] = new List<SelectListItem>()
    {           
        new SelectListItem{ Text="Ohio", Value="OH"},
        new SelectListItem{ Text="Oklahoma", Value="OK"},
        ....
    };
    return View(operation);
}

和视图

@Html.DropDownListFor(m => m.State, (IEnumerable<SelectListItem>)ViewData["StateList"])

在您的示例中,第一个选项("Ohio")将被选中,因为State的值是null,并且与您的一个选项不匹配。如果你在控制器中使用operation.State = "OR";,那么第3个选项("Oregon")将在你第一次渲染视图时被选中。

最新更新