只要正确使用索引,这应该不是问题。这是我设想表单名称的方式。
型号[0].foo
模型[0].Inner[0].bar
模型[0].Inner[1].bar
其中外部模型有一个名为 foo 的属性,而外部模型有一个名为 inner 的属性,它是内部对象的集合。内部对象有一个名为 bar 的属性。如果您的表单使用正确的索引呈现,那么模型绑定应该可以工作。如果表单字段是在客户端生成的,事情会变得很棘手。我建议返回服务器以操作模型。有一些额外的往返,但您可以通过 Ajax 请求进行。
这是一个更充实的示例中的更多细节。
public class InnerModel{
public string Name{get; set;}
}
public class OuterModel{
public List<InnerModel> InnerModels{get; set;}
public string Name{get; set;}
}
以下是我设想的我的观点:
@model IEnumerable<OuterModel>
<ul>
@{int i = 0;}
@foreach(var item in Model){
<li>
Outer Name : @Html.TextBoxFor(m=>Model[i].Name)
<br />
@{int j = 0;}
<ul>
@foreach(var innerItem in Model[i].InnerModels){
<li>Inner Name : @Html.TextBoxFor(m=> Model[i].InnerModels[j].Name)</li>
j++;
}
</ul>
i++;
</li>
}
</ul>
如果它被包装在一个表单中---并且控制器动作如下所示:
public ActionResult Action(List<OuterModel> model){
}
那么我认为模型会正确填充。
我注意到你的表格..它看起来不对我......我不认为像这样传递 OuterModels 会起作用 - 尽管坦率地说我可能是错的。
@using (Html.BeginForm("Create", "Controller", new { OuterModels = Model }, FormMethod.Post))
{
//Code to create the InnerModels here
}
这是我为我教的课做的一个例子..这绝对有效..
public class Author
{
public string Name { get; set; }
}
public class Book
{
public string Name { get; set; }
public List<Author> Authors { get; set; }
}
控制器:
public class BookController : Controller
{
public static List<Book> _model = null;
public List<Book> Model
{
get
{
if (_model == null)
{
_model = new List<Book>
{
new Book{
Name = "Go Dog Go",
Authors = new List<Author>{
new Author{Name = "Dr. Seuss"}
}},
new Book{
Name = "All the Presidents Men",
Authors = new List<Author>{
new Author{Name = "Woodward"},
new Author{Name = "Bernstein"}
}},
new Book{
Name = "Pro ASP.NET MVC Framework",
Authors = new List<Author>{
new Author{Name = "Sanderson"},
new Author{Name = "Stewart"},
new Author {Name = "Freeman"}
}}
};
}
return _model;
}
}
public ActionResult Index()
{
return View(Model);
}
public ActionResult Edit()
{
return View(Model);
}
[HttpPost]
public ActionResult Edit(List<Book> books)
{
_model = books;
return RedirectToAction("Index");
//return View(books);
}
}
和查看:
@model List<AmazonWeb.Models.Book>
@{
ViewBag.Title = "Index";
}
<div class="content">
@Html.ActionLink("Index", "Index")
@using (Html.BeginForm())
{
<input type="submit" value="save" />
<ul class="book-list">
@for (var i = 0; i < Model.Count; i++ )
{
<li>
<label>Book Name</label> : @Html.TextBoxFor(m => Model[i].Name)
<ul>
@for (var j = 0; j < Model[i].Authors.Count; j++ )
{
<li><label>Author Name</label> : @Html.TextBoxFor(m => Model[i].Authors[j].Name)</li>
}
</ul>
</li>
}
</ul>
<input type="submit" value="save" />
}
</div>