Как использовать несколько элементов формы в ASP.NET MVC - PullRequest
11 голосов
/ 21 февраля 2011

Итак, я новичок в 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>
}

Как сделать текстовое поле для каждого гостя?И как мне перехватить их в методе действия, к которому они возвращаются?

Спасибо за любую помощь.

Ответы [ 2 ]

20 голосов
/ 21 февраля 2011

Определенно работа для шаблона редактора.Таким образом, по вашему мнению, вы помещаете эту единственную строку:

@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, вы должны знать, что вы делаете это неправильно и что есть лучший способ.

8 голосов
/ 21 февраля 2011

Вы можете сделать это:

@for (int i = 0; i < Model.Guests.Count; i++) {
  @Html.TextBoxFor(m => m.Guests.ToList()[i].FirstName)
}

Есть еще примеры и подробности о этой записи от Haacked.

ОБНОВЛЕНИЕ: Операция поста контроллера должна выглядеть следующим образом:

[HttpPost]
public ActionResult Index(Room room)
{
    return View();
}

В этом примере я рассматриваю, что у вас есть класс комнаты, подобный этому:

public class Room
{
    public List<Guest> Guests { get; set; }
}

Вот и все, в сообщении вы должны правильно заполнить список гостей.

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