如何在ASP.NET MVC中使用多个表单元素

Che*_*hev 11 c# asp.net asp.net-mvc razor asp.net-mvc-3

所以我是ASP.NET MVC的新手,我想创建一个带有文本框的视图,用于集合中的每个项目.我该怎么做,以及如何在POST回来时捕获信息?我已经使用表单和表单元素为模型构建静态表单,但从不基于可变大小的集合动态生成表单元素.

我想在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>
}
Run Code Online (Sandbox Code Playgroud)

如何为每位客人提供文本框?我如何在它回发的动作方法中捕获它们?

谢谢你的帮助.

Dar*_*rov 20

绝对是编辑模板的工作.所以在你看来,你把这一行:

@Html.EditorFor(x => x.Guests)
Run Code Online (Sandbox Code Playgroud)

并在相应的编辑器模板(~/Views/Shared/EditorTemplates/Guest.cshtml)内

@model AppName.Models.Guest
<div>
    First Name:<br />
    @Html.TextBoxFor(x => x.FirstName)
</div>
Run Code Online (Sandbox Code Playgroud)

这就是全部.

现在,以下操作将开箱即用:

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");
}
Run Code Online (Sandbox Code Playgroud)

请注意,编辑器模板的名称很重要.如果视图模型中的属性是:

public IEnumerable<Guest> Guests { get; set; }
Run Code Online (Sandbox Code Playgroud)

应该调用编辑器模板Guest.cshtml.它将自动为Guests集合的每个元素调用,它将负责正确生成输入的ID和名称,以便在POST回来时一切都自动运行.

结论:每次你写一个循环(forforeach)一个ASP.NET MVC里面查看你应该知道,你做错了,并且有更好的办法.


goe*_*ing 8

你可以这样做:

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

Haacked 在这篇文章中有更多的例子和细节.

更新:控制器发布操作应如下所示:

[HttpPost]
public ActionResult Index(Room room)
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我认为你有一个像这样的Room类:

public class Room
{
    public List<Guest> Guests { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这就是全部,在post post上,你应该正确填充Guests列表.