DropDownListFor选择不起作用 - 再次

时间:2010-11-14 23:04:44

标签: asp.net-mvc drop-down-menu html.dropdownlistfor

是的,我知道,这个问题被提出/回答了34798796873.5次。我查看了所有3个bajillion,我仍然有问题。我在这里缺少什么?

我尝试了几种方法,但没有一种方法可行。以下是我最近的尝试:

<%:Html.DropDownList("Author",
    Model.AuthorItems.Select(i =>
        new SelectListItem
        {
            Text = i.Name,
            Value = i.Id.ToString(),
            Selected = i.Id == Model.Author.Id
        }), "無し")%>

<%:Html.DropDownListFor(m => m.Author,
    new SelectList(Model.AuthorItems,
        "Id",
        "Name",
        Model.Author),
    "無し") %>

我的视图模型非常简单:

public class EditArticleViewModel
{
    public AuthorItem Author { get; set; }

    public IList<AuthorItem> AuthorItems { get; set; }
    public class AuthorItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

我确保我的行动正常;果然,作者的Id为5,而AuthorItems的Id为5。

我甚至尝试在模型中重写Equals和GetHashCode。

Blahhhhh !! 1

2 个答案:

答案 0 :(得分:6)

在您的视图模型中替换:

public AuthorItem Author { get; set; }

public int? SelectedAuthorId { get; set; }

并在您的视图中将下拉列表绑定到此SelectedAuthorId

<%:Html.DropDownListFor(
    m => m.SelectedAuthorId,
    new SelectList(Model.AuthorItems, "Id", "Name"),
    "無し"
) %>

现在,只要您在控制器操作中提供有效的SelectedAuthorId值:

model.SelectedAuthorId = 123;

呈现下拉列表的HTML帮助程序将正确地从列表中预先选择具有此给定ID的项目。

这样做的原因是,在下拉列表中,您只能选择单个值(标量类型)而不能选择整个作者(当您提交表单时,HTTP请求中发送的所有内容都是此选定值)。

答案 1 :(得分:0)

DropDownList / DropDownListFor使用的ModelState值。因此,在控制器中设置ViewDataDictionary selectedValue。

public ActionResult Index()
{
  var model = new EditArticleViewModel
          {
            Author = new EditArticleViewModel.AuthorItem() {Id = 3, Name = "CCC"},
            AuthorItems = new List<EditArticleViewModel.AuthorItem>()
            {
              new EditArticleViewModel.AuthorItem() {Id = 1, Name = "AAA"},
              new EditArticleViewModel.AuthorItem() {Id = 2, Name = "BBB"},
              new EditArticleViewModel.AuthorItem() {Id = 3, Name = "CCC"},
              new EditArticleViewModel.AuthorItem() {Id = 4, Name = "DDD"},
            }
          };

  ViewData["Author"] = model.Author.Id;
  return View(model);
}

查看代码简单。

<%:Html.DropDownList("Author", 
        new SelectList(Model.AuthorItems,
            "Id",
            "Name"), "無し")%>

<%:Html.DropDownListFor(m => m.Author,
    new SelectList(Model.AuthorItems,
        "Id",
        "Name"),
    "無し")%>

ViewData键“作者”正在对所选值使用模型状态绑定。

希望得到这个帮助。