0

クラス(ClassA)を使用してMVCによって作成された基本的な作成/編集/削除/インデックス形式があります。このクラスには、オブジェクトのリスト(ClassB)が含まれています。

ビューを呼び出してオブジェクトを編集すると、ClassAのすべてのメンバー(テキストフィールドなど)を編集できますが、オブジェクトのリストを編集してから、ポストアクションに戻すにはどうすればよいですか?

オブジェクトを作成して反復処理し、フォームに追加しようとすると、オブジェクト(ClassA)とともに返されません。また、オブジェクトのリストは空です。

助けてください。これを行うためのベストプラクティスは何ですか?

以下は例です

 public ActionResult Edit(int id)
    {
        ClassA objA = db.ClassAs.Single(a => a.id == id);

        objA.myListOfBs.Add(new ClassB());

        return View(objA);
    }

     [HttpPost]
    public ActionResult Create(ObjectA obj)
    {
        obj.myListOfBs <--- this is empty! :(
        if (ModelState.IsValid)
        {
        }

        return View(obj);
      }

モデルクラスは次のとおりです。

class ClassA {
        int id;
    List<ClassB> myListOfBs;
 }

 class ClassB {
    int id;
    string name;
 }

これが私の見解です

@model MyProject.Models.ClassA

@{
    ViewBag.Title = "ClassA Object";
}
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Objects</legend>

        @Html.EditorFor(model => model.myListOfBs)

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
4

3 に答える 3

1

これが起こっている理由を見つけました。それは私にとっては間違いでしたが、私が気づかなかったことがそれを引き起こしているのです。

メインオブジェクト内のオブジェクトが宣言されました

class ClassA {
 public ClassB country;
}

それ以外の

class ClassA {
 public ClassB country {get; set;}
}

したがって、オブジェクトを正しくバインドするには、プロパティである必要があるようです。

ここで解決された主な問題

また、set / getタグを追加すると、オブジェクトを投稿に渡すことができますが、オブジェクト内のリストでは機能しないことも付け加えておきます。

基本的にモデル内の特定のアイテムにマップする必要がある場合、ここでこれを行う方法(ASP.NET MVC 3オブジェクト内のコレクションへのバインド)を最終的に見つけました。

例:

 @for (int i = 0; i < Model.myListOfBs.Count; i++)
 {
     <div>
        @Html.LabelFor(m => Model.myListOfBs[i].name )
    </div>
    <div>
        @Html.TextBoxFor(m => Model.myListOfBs[i].name )
    </div>
 }

配列の場所に明示的にマッピングすることでうまくいきました。foreachを使用してリストのアイテムに明示的にマップすることはできないため、失敗します。

また、あなたが私のようでEntity Frameworkを使用している場合は、配列要素にアクセスするためにViewModelsを使用する必要があります。

于 2013-03-14T16:52:56.350 に答える
0

私が過去にこれを行った方法は、モデルバインダーがコレクションをバインドするために認識できる命名規則を使用することです。

たとえば、あなたの場合、あなたの見解には以下が含まれる可能性があります。

@model ClassA
int index = 0;
@foreach (var classB in Model.myListOfBs)
{
    //Notice the use of "obj", this matches the name of your model parameter in your post action
    @Html.Hidden("obj.myListOfBs.Index", index)
    @Html.TextBox("obj.myListOfBs[" + index + "].name", classB.name)
    index++;
}

このフォームをアクションに投稿する場合、モデルバインダーは、上記のインデックス命名規則を使用して、各フィールドをモデルのmyListOfBsコレクションにバインドします。

または、@ thedixonが指摘しているように、MVCフレームワークはフィールド名を自動的に作成できます(これがASP.NET MVCのすべてのバージョンで可能かどうかはわかりません)。

@Html.EditorFor(model => model.myListOfBs)
于 2013-03-14T13:09:43.627 に答える
0

私は前にこれを見たことがあります。これを行う最も簡単な方法(この構造例を使用)は次のとおりです。

ViewModel:

public string CompanyName { get; set; }
public List<ViewModelOfObjects> SubObjects { get; set; }

ご覧のとおり、サブオブジェクトには独自のViewModelが必要です。その後、ビューでこれを行うことができます。

@model YourMainViewModel

@Html.EditorFor(model => model.CompanyName)

// MVC is clever enough to work this out and list all the sub-Views, even if they are hidden fields and not editable.
@Html.EditorFor(model => model.SubObjects)
于 2013-03-14T13:02:24.130 に答える