DropDownList для выбора не работает - снова - PullRequest
1 голос
/ 15 ноября 2010

Да, я знаю, этот вопрос задавали / отвечали 34798796873,5 раза.Я просмотрел все 3 баджиллиона, и у меня все еще есть проблема.Что мне здесь не хватает?

Я пробовал несколько подходов, и ни один из них не работает.Вот мои последние попытки:

<%: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; }
    }
}

Я убедился, что мое действие работает правильно;Конечно, Author имеет Id 5, а AuthorItems имеет запись с Id 5.

Я даже пытался переопределить Equals и GetHashCode в модели.

Ответы [ 2 ]

6 голосов
/ 15 ноября 2010

На ваш взгляд модель замените:

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, который отображает раскрывающийся список, правильно выберет элемент из списка с указанным идентификатором.

Причина этого заключается в том, что в раскрывающемся списке вы можете выбрать только одно значение (скалярный тип), а не весь Автор (все, что отправляется в запросе HTTP при отправке формы, является этим выбранным значением).

0 голосов
/ 15 ноября 2010

DropDownList / DropDownList для используемого значения 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 "Author" использует привязку состояния модели для выбранного значения.

Hopeэта помощь.

...