2

我有一个问题,下拉列表中的项目没有被选中。我正在构建一个 SelectListItems 数组并将正确的设置为 selected = true 但它没有被选中。

我的控制器中有以下代码:

    public ActionResult Edit(int id)
    {
        var p = _myRepository.FindBy(id);
        var vm = new MyViewModel(p) { CategoryTypes = ControllerUtils.GetList(_myTypeRepository, r => r.Name, p.CategoryType.Id) };

        return View(vm);
    }

这是 ControllerUtils 类中的 GetList 函数:

public static class ControllerUtils
{
    public static IEnumerable<SelectListItem> GetList<T>(IIntKeyedRepository<T> list, Func<T, string> getName, int id) where T : BaseModel
    {
        var items = list.All().ToList();
        var itemsList = items.Select(r => new SelectListItem() { Selected = r.Id == id, Text = getName(r), Value = r.Id.ToString() });
        return itemsList;
    }
}

这是我的视图代码:

    <div class="editor-label">
        @Html.LabelFor(model => model.MyObject.CategoryType)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.MyObject.CategoryType, Model.CategoryTypes)
        @Html.ValidationMessageFor(model => model.MyObject.CategoryType)
    </div>

当我在控制器代码中调试并列出 SelectListItem 对象数组时,我确实看到第二项已选中 = true。但是当我检查视图 HTML 时,我没有看到任何一个项目被选中:

<select id="CategoryType" name="CategoryType">
  <option value="1">Choice 1</option>
  <option value="2">Choice 2</option>
</select>

如您所见,这两个项目都没有“selected="selected"。关于这里可能发生的事情有什么建议吗?

4

2 回答 2

4

DropDownListFor helper 的第一个参数必须是一个 lambda 表达式,指向视图模型上包含所选值的原始类型属性:

@Html.DropDownListFor(
    model => model.MyObject.CategoryType.Id, 
    Model.CategoryTypes
)

现在摆脱Selected = r.Id == id你的SelectListItem. 你不需要它。现在假设在助手Model.MyObject.CategoryType.Id内部有一个具有匹配值的对应项目Model.CategoryTypes将自动预选这个项目。

于 2012-10-20T16:55:47.873 回答
1

不要使用该SelectListItem.Selected属性来判断选择了哪个项目。我注意到DropDownListFor忽略了这一点。

相反,您应该model.MyObject.CategoryType设置为该值2(或"2"),以便下拉菜单选择第二个项目。

于 2012-10-20T16:36:23.060 回答