#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);
}
}