MVC: привязка динамического списка выбора обратно к ViewModel в Post - PullRequest
1 голос
/ 25 мая 2011

У меня есть проект MVC 3, и я застрял при привязке представления к модели в Post.

Вот моя модель:

public class DBViewModel
{
   public ProductionDatabasesViewModel PDBViewModel { get; set; }
   public IList<string> SelectedNames { get; set; }

   public DBViewModel()
   {
     SelectedNames = new List<string>();
     PDBViewModel = new ProductionDatabasesViewModel();
   }
}

Мой взгляд: (урезанная версия)

@model Web.Models.DBViewModel
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
       @Html.ListBoxFor(x => x.SelectedNames, new SelectList(Model.SelectedNames))
       <input id="button-submit" name="SubmitButton" type="submit" value="Submit" />
    </fieldset>
}

Фрагмент контроллера:

  [HttpPost]
  public ActionResult Database(DBViewModel model)
  {
    var users = model.SelectedNames; //<---- empty, the count is 0 always.
  }

В представлении есть возможность выбрать пользователей из поля автозаполнения, а затем скрипт jQuery, который добавит выбранные имена в список в представлении выше. Это все работает, поэтому я могу искать пользователей, а затем нажать кнопку «Добавить», чтобы добавить пользователей в список. Но я сталкиваюсь с проблемами при нажатии кнопки Отправить. Пользователи, которые были добавлены в представление (список выбора в представлении), не привязаны к модели. Так что на пост модель. Выбранные имена пустые. Я также пробовал Request ["SelectedNames"] и Request.Form ["SelectedNames"], и все они нулевые.

У меня большой опыт работы с обычными веб-формами, но я все еще изучаю MVC, поэтому любая помощь будет высоко оценена.

[UPDATE]

Я обновлю вопрос завтра в моё время, но, похоже, что элементы в списке будут привязаны к модели представления, если я выберу их. Я выясню это завтра. Но большое спасибо за все комментарии, помощь и предложения.

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Означает ли это Подсказка модели в списке поддержки бета-версии ASP.NET MVC ? отвечает на ваш вопрос?Список строк является более простой версией.

1 голос
/ 26 мая 2011

Хорошо, я нашел, в чем проблема.Если в html-элементе есть элемент множественного выбора, который вы хотите связать со значениями в блоке обратно к модели, вы должны сначала выбрать элементы.Очень раздражает, но это похоже на то, чего он хочет.

Так что, если у вас есть поле выбора, например:

<select id="selected-ad-users-list" name="SelectedNames" multiple="multiple" size="5"
       style="width: 100%">
</select>

И вы добавляете элементы к нему из любого места, действительно, в моемВ этом случае у меня был другой список / или текстовое поле, в котором они вводили имя, а затем я использовал jQuery для заполнения этого списка выбора.Мне нужно было добавить немного скрипта jQuery, чтобы прокрутить мой список и выбрать все элементы.Поэтому, когда элементы выбраны, они будут привязаны к модели.

Вот хорошая статья на эту тему: выберите все или некоторые элементы в окне выбора

Я действительно надеюсь, что это кому-то поможет.

1 голос
/ 25 мая 2011

Должен сказать, что эта урезанная версия вашего кода работает как надо. SelectedNames список успешно заполнен из списка после отправки. Вы можете проверить это сами. Хотя я сделал несколько изменений:

  • удалены все ссылки на ProductionDatabasesViewModel;
  • изменен тип возврата POST-версии База данных метод на void ;
  • добавлена ​​GET-версия База данных метод

public ActionResult Database()
{
    return View(new DBViewModel { SelectedNames = { "a", "b", "c" } });
}

Так что я считаю, что у вас есть ошибка где-то еще, не в этих частях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...