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

How to populate SelectList with States in Controller Create Action

我正在尝试使用 MS 教程 NerdDinner 中的代码来填充带有状态的下拉列表,包括已经存在的任何内容(用于编辑 ActionResult)。

这是在 NerdDinner 中用于 Phone 个国家的内容:

//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.State 是 typeof SelectListItem

其次,您不能为您绑定的 属性 和 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";,那么当您第一次渲染视图时将选择第三个选项 ("Oregon")。