インデックスが適切に使用されている限り、これは問題にはなりません。これが私がフォーム名をどのように想像するかです。
Model [0] .foo
Model [0] .Inner [0] .bar
Model [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>