0

OuterModelとInnerModelの2つのモデルがあります。OuterModelとInnerModelの間には、それぞれ1対多の関係があります。私の質問を明確にするために、私のモデルはIEnumerable<OuterModel>タイプです。ランダムな数のOuterModelをビューに渡し、ユーザーはOuterModelごとに任意の数のInnerModelを作成します。次に、送信時に、コントローラーがOuterModelsのリストを受信して​​、InnerModelsをデータベースの目的のOuterModelsに追加できるようにします。

私は、MVCの組み込みモデルバインディングを利用するための正しい命名規則があると信じています。これは次のようになります。

OuterModel[i].InnerModel[j].Property

私の問題は、コントローラーに渡されるOuterModelsのリストを取得する方法が本当にわからないことです。これが私のビューで試したことです:

    @model IEnumerable<OuterModel>

    @using (Html.BeginForm("Create", "Controller", new { OuterModels = Model }, FormMethod.Post))
    {
       //Code to create the InnerModels here
    }

そして、これが私のコントローラーにあるものです:

    [HttpPost]
    public ActionResult Create(IEnumerable<OuterModel> OuterModels, FormCollection fc)
    {
       String[] keys = fc.AllKeys;
       if(ModelState.IsValid){
          //Add to db
       }
    }

Keysは、すべてのプロパティが以前に指定した命名規則に従っていることを示していますが、ModelState.IsValidはfalseを返しています。OuterModelsのカウントが0であることを示しています。

InnerModelsが作成される前にOuterModels=Modelを送信するようにフォームに指示していますが、ビューに渡されることを考慮すると、OuterModelsにはまだデータがあると思います。今日は本当に疲れているので、1つ(または多く)の小さな詳細を見ていると思います。助言がありますか?

- 編集 -

OuterModelsのリストをコントローラーに渡すことは、最善の方法ではない場合があります。誰かがより良い提案を持っているなら、共有してください。

4

1 に答える 1

1

インデックスが適切に使用されている限り、これは問題にはなりません。これが私がフォーム名をどのように想像するかです。

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>
于 2012-07-10T21:41:19.647 に答える