ASP.NET MVC 3 — Выбор элементов с помощью флажков

#c# #asp.net-mvc #data-binding #asp.net-mvc-3 #model-binding

#c# #asp.net-mvc #привязка к данным #asp.net-mvc-3 #привязка к модели

Вопрос:

У меня есть приложение на MVC 3 со страницей, где пользователи могут запросить дополнительную информацию о нашем сервисе.

Когда пользователь выбирает свое состояние из выпадающего списка, я хочу использовать jQuery ajax для извлечения списка продуктов, которые мы предлагаем в этом состоянии. Для каждого продукта я бы хотел отобразить флажок рядом с названием продукта. Затем пользователь может выбрать, какие продукты его интересуют.

Я хотел бы привязать выбранные продукты к свойству списка в модели для этого представления. Таким образом, модель будет иметь свойство для name, email и т.д. И свойство List. Вот пример класса модели, к которому я пытаюсь привязаться:

 public class RequestInformationModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public List<Product> Products { get; set; }
}
  

Вот метод контроллера, на который я отправлю форму:

 public ActionResult RequestInformation(RequestInformationModel model)
{
    // do stuff
}
  

Есть какие-нибудь советы о том, как этого добиться? Большое спасибо.

Ответ №1:

Если вы добавите к названию полей в вашем объекте product название списка и их индекс в квадратных скобках, то MVC свяжет список для вас

Например.

 <input type="checkbox" name="Products[0].InterestedInCheckbox" />
<input type="checkbox" name="Products[1].InterestedInCheckbox" />
  

В этом случае объекту Product требуется свойство bool с именем InterestedInCheckbox

Для работы этого метода у вас должны быть последовательные индексы, начинающиеся с 0 (вам понадобится скрытое поле и немного другая техника, если это не так)

Наконец, я бы использовал Html Checkbox helper для создания флажков, поскольку это выведет скрытое поле после требуемых флажков:

(следующий код не протестирован)

 @for (var i = 0; i < Model.Count; i  )
{
    @Html.CheckBox(string.Format("Products[{0}]", i), Model[i])
}
  

Комментарии:

1. Возможно, просто захочется заключить их в двойные кавычки Products[{0}] . Хотя предложение хорошее.

Ответ №2:

Я думаю, что вы хотите что-то вроде этого:

 /* Handles ajax request */
[HttpPost]
public ContentResult(string selectedListBoxItem)
{
  string content = "";

  /* TODO: Query DB to get product suggestions based on selectedListBoxItem */

  content = "<input type='checkbox' id='productId1' name='productSuggestion' value='productId1'>";
  content  = "<input type='checkbox' id='productId2' name='productSuggestion' value='productId2'>";
  content  = "<input type='checkbox' id='productId2' name='productSuggestion' value='productId2'>";
  return Content(content);
}

 /* Handles final submit */
[HttpPost]
public ActionResult HandleSubmit(string nameOfCheckboxCollection)
{
  string[] arrayChecked = nameOfCheckboxCollection.Split(",");
  foreach(string s in arrayChecked ) { 
      Model.addProduct(s); 
   } 
}