Как использовать несколько элементов формы в ASP.NET MVC
Итак, я новичок в ASP.NET MVC, и я хотел бы создать представление с текстовым полем для каждого элемента в коллекции. Как мне это сделать, и как я могу получить информацию, когда она возвращается? Я использовал формы и элементы формы для создания статических форм для модели, но никогда не создавал динамически сформированные элементы формы на основе коллекции переменных размеров.
Я хочу сделать что-то подобное в mvc 3:
@foreach (Guest guest in Model.Guests)
{
<div>
First Name:<br />
@Html.TextBoxFor(???) @* I can't do x => x.FirstName here because
the model is of custom type Invite, and the
lambda wants to expose properties for that
type, and not the Guest in the foreach loop. *@
</div>
}
Как сделать текстовое поле для каждого гостя? И как я могу их захватить в методе действий, который он отправляет обратно?
Спасибо за любую помощь.
Ответы
Ответ 1
Определенно задание для шаблона редактора. Поэтому, по вашему мнению, вы помещаете эту единственную строку:
@Html.EditorFor(x => x.Guests)
и внутри соответствующего шаблона редактора (~/Views/Shared/EditorTemplates/Guest.cshtml
)
@model AppName.Models.Guest
<div>
First Name:<br />
@Html.TextBoxFor(x => x.FirstName)
</div>
И это обо всем.
Теперь следующие действия будут работать из коробки:
public ActionResult Index(int id)
{
SomeViewModel model = ...
return View(model);
}
[HttpPost]
public ActionResult Index(SomeViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
// TODO: do something with the model your got from the view
return RedirectToAction("Success");
}
Обратите внимание, что имя шаблона редактора важно. Если свойство в вашей модели просмотра:
public IEnumerable<Guest> Guests { get; set; }
шаблон редактора следует называть Guest.cshtml
. Он будет автоматически вызываться для каждого элемента коллекции Guests
, и он позаботится о том, чтобы правильно генерировать идентификаторы и имена ваших входов, чтобы при возврате POST все было автоматически.
Заключение: каждый раз, когда вы пишете цикл (for
или foreach
) внутри представления ASP.NET MVC, вы должны знать, что делаете это неправильно и что есть лучший способ.
Ответ 2
Вы можете сделать это:
@for (int i = 0; i < Model.Guests.Count; i++) {
@Html.TextBoxFor(m => m.Guests.ToList()[i].FirstName)
}
Более подробную информацию о этом сообщении см. Haacked.
UPDATE:. Действия с контроллером должны выглядеть так:
[HttpPost]
public ActionResult Index(Room room)
{
return View();
}
В этом примере я рассматриваю, что у вас есть класс комнаты следующим образом:
public class Room
{
public List<Guest> Guests { get; set; }
}
Чтобы все, в результате действия post, должны были правильно заполнить список гостей.