4

私は MVC が初めてで、これを理解するのに苦労しています。

簡単にするために、「Person」オブジェクトがあり、このオブジェクトには「EmailaddressList」という IEnumerable プロパティがあります。

Visual Studio 2012 を使用して編集ページを生成しました。メイン オブジェクトのプロパティは、Name や LastName などのテキスト ボックスを含む編集ページで生成されます。

ただし、サブオブジェクトの IEnumerable リスト内の電子メール アドレスのリストは、私の見解では自動的に生成されません。これで問題ありません。メールアドレスの種類ごとにタブを使用してコードを手書きしました。

ここまでは順調ですね。

問題: HTTP-Post メソッドでモデル (人物オブジェクト) を受け取ると、EmailAddressList が null です。どうしてこうなったのか、ビューに送ったらnullじゃなかった。メールアドレスが一覧表示されているタブが部分的に表示されています。誰かが私にいくつかのヒントを教えてもらえますか?それは私がここで見逃しているものですか?*

ビューコード

<div id="tabs">
<ul>
    @foreach (var item in Model.EmailAddressList)
    {
        <li><a href="#@item.AddressType">@Html.Label(item.AddressType)</a></li>
    }
</ul>
@foreach (var item in Model.EmailAddressList)
{
    <div id="@item.AddressType">
        <p>
            @Html.TextBoxFor(s => item.EmailAddress, new { @class = "input-xxlarge" })
        </p>
    </div>
}
</div>

コントローラ(受信メソッド) ここで person.EmailAddressList は null

    [HttpPost]
    public ActionResult Create(Person person)
    {
        if (ModelState.IsValid) 
        {
            personRepository.InsertOrUpdate(person);
            personRepository.Save(); 
            return RedirectToAction("Index");
        } 
        else 
        {
            return View();
        }
    }
4

3 に答える 3

6

これは、フィールドを正しくインデックス化する (モデル バインダーが機能できるようにする) ために、forループを使用する必要があるためです。

まず、 yourIEnumerableを aに変更しますList(ビューでインデクサーを使用できるようにします)。

次にforeach、次のforループになるように変更します。

@for (int i = 0; i < Model.EmailAddressList.Count; i++)
{
    <div id="@Model.EmailAddressList[i].AddressType">
        <p>
            @Html.TextBoxFor(m => m.EmailAddressList[i].EmailAddress, new { @class = "input-xxlarge" })
        </p>
    </div>
}
于 2013-04-23T14:22:52.203 に答える
1

あなたの更新に基づいて、これが機能しない理由は、デフォルトのモデル バインダーが単純なデータのコレクションの順序のみに依存しているためです。複雑なタイプになると、アイテムごとに関連するインデックスを提供する必要があります。そうしないと、参照しているアイテムのプロパティがわかりません。

@for (int i = 0; i < Model.EmailAddressList.Count; i++) {
    Html.TextBoxFor(m => m.EmailAddressList[i].EmailAddress) %>
}

リストへのモデル バインディングに関する Phil Haack の記事を参照してください。

于 2013-04-23T14:44:15.453 に答える
0

これは、MVC がポストバックでそれらを取得するための正しい要素が ID 化されていないためです。必要なのは次のとおりです。

@Html.EditorFor(model => model.EmailAddressList);

次に、これを希望する方法で作成する方法について、ここにある私の投稿を参照してください。

于 2013-04-23T14:14:04.640 に答える