0

マイページでは、ユーザーがチェックボックスリストからビジネスを選択し、それらのビジネスをデータベースに挿入できます。

foreach を使用してフォーム コレクションの各項目をループし、db コンテキストを介して保存します。

これらはすべてうまく機能しています。

public ActionResult RecordBusinesses(FormCollection collection)
    {
        foreach (var item in collection.GetValues("mycheckboxlist"))
        {
            modelentity modelentity = new modelentity();

            if (ModelState.IsValid)
            {
                db.modelentity.Add(modelentity);
                db.SaveChanges();
            }

            return PartialView("_mypartialview", modelentity);
        }
        return PartialView("_mypartialview");
    }

ビューでは、チェックボックス リストが ajax フォームでラップされています。

@using (Ajax.BeginForm(
                        "RecordBusinesses",
                        new AjaxOptions
                        {
                        HttpMethod = "POST",
                        InsertionMode = InsertionMode.InsertBefore,
                        UpdateTargetId = "insertedbusiness"
                        }))
                        {

                            foreach(var b in Model)
        {
            <input type="checkbox" name="mycheckboxlist" value="@b.businessid">@b.name
        <br />
        }
                            </div>
                            <input type="submit" />
                        }

このフォームはアクションに投稿され、ここでもすべてがうまく機能しています。

私の問題は、最初のエントリだけが画面に戻されることです。そのため、チェックボックスでビジネスが 1 つしか選択されていない場合は、コントローラーから返されるパーシャルビューが dom に追加されますが、複数のビジネスが選択されている場合は、最初のビジネスのみが表示されます。

最初の挿入が成功した後にコントローラーメソッドが「戻り」、プロセスを終了し、その後の呼び出しが行われないためだと思います。

私の唯一の混乱は、すべてのビジネスが正常に挿入されたことです。それらも失敗すると思いますが、ページを更新すると、すべてのビジネスが正しく表示されます。

4

2 に答える 2

4

ここでの問題はあなたの行動です

public ActionResult RecordBusinesses(FormCollection collection)
{
    foreach (var item in collection.GetValues("mycheckboxlist"))
    {
        ...
        return PartialView("_mypartialview", modelentity);
    }
    return PartialView("_mypartialview");
}

アクションから要求が終了するreturnと、ASP.NET はループの残りを反復処理する必要があることを認識しません。もしそうなら、それはおそらくあなたが望まないであろうサーバーへの&からの複数の呼び出しをもたらすでしょう。

考えてみてください、あなたのコードは

for(int i = 0; i <= 10; i++)
{
    Console.WriteLine(i);
    return i;
}

これは出力するだけ0です。ここにyieldキーワードがある後のあなたの本当の姿のようです

for (int i = 0; i <= 10; i++)
{
    yield return i;
}

これは、HTTP 要求のコンテキストで ASP.NET では実行できないと確信しています。

これを回避する方法は、すべてのレンダリング サーバー側を行うことです。アクションを変更して、モデルを実際にコンテナー ビューに戻します。

public ActionResult RecordBusinesses(FormCollection collection)
{
    List<Entity> myEntities = ...;
    foreach (var item in collection.GetValues("mycheckboxlist"))
    {
        ...
        myEntities.Add(new ...);
    }
    return View("SomeContainerView", myEntities);
}

次に、ビューで、各パーシャルをレンダリングする呼び出しを行います

@model System.Collections.Generic.List<Entity>

@foreach (var entity in Model)
{
     @Html.RenderPartial("_mypartialview", entity)
}
于 2013-11-11T15:05:10.710 に答える
1

1 つの HTTP 要求に対して複数の HTTP 応答を受信できないのと同じ意味で、1 つのアクションから複数の部分ビューを返すことはできません。

部分ビューを変更して、エンティティのコレクションを受け入れ、それらすべてをループでレンダリングすることを検討してください。

于 2013-11-11T15:05:18.880 に答える