所以我是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>
}
如何为每位客人提供文字框?我如何在它回发的动作方法中捕获它们?
感谢您的帮助。
答案 0 :(得分:20)
绝对是编辑模板的工作。因此,在您看来,您将这一行:
@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
集合的每个元素调用,它将负责正确生成输入的ID和名称,以便在POST回来时一切都自动生效。
结论:每次在ASP.NET MVC视图中编写循环(for
或foreach
)时,您都应该知道自己做错了,并且有更好的方法。
答案 1 :(得分:8)
你可以这样做:
@for (int i = 0; i < Model.Guests.Count; i++) {
@Html.TextBoxFor(m => m.Guests.ToList()[i].FirstName)
}
Haacked有更多关于this post的例子和细节。
更新:控制器发布操作应如下所示:
[HttpPost]
public ActionResult Index(Room room)
{
return View();
}
在这个例子中,我认为你有这样的Room类:
public class Room
{
public List<Guest> Guests { get; set; }
}
就是这一切,在帖子操作上,你应该正确填充Guest列表。