0

ドロップダウンリストから読み直された値を、同じドロップダウンリストが結果とともに表示されるビューに戻す方法を理解しようとしています

コントローラ:

//
// GET: /ProductByID/

[HttpGet]
public ActionResult ProductById()
{
    ViewBag.IDNumbers = ddlItems;
    return View();
}


//
// POST: /ProductByID/

[HttpPost]
public ActionResult ProductById(FormCollection formdata)
{
    string selected = formdata["IDNumbers"];
    int id = int.Parse(selected);
    Product p = items.GetByID(id);
    return View(p);
}

景色:

@model ProductsMVC_Basic.Models.Product

@{
    ViewBag.Title = "Product By Id";
}


<script src="~/Scripts/jquery-1.7.1.js"></script>
<script>
    $(function () {
        $("#IDNumbers").change(function () {
            if ($("#IDNumbers").val() != "") {
                this.form.submit();
            }
        });
    });
</script>

<div>
    @using (Html.BeginForm("ProductById", "Home", FormMethod.Post))
    {
        @Html.DropDownList("IDNumbers", "--Select One--") 
    }

</div>

これは、ドロップダウンリストに入力し、フォームデータをコントローラーに送り返す限り機能します。私の質問は、ドロップダウンが表示され、名前やカテゴリなどのモデルデータも表示されるように、投稿ビューにモデルデータを表示する方法です.

同じビューにポストバックするたびに、「キー 'IDNumbers' を持つタイプ 'IEnumerable' の ViewData アイテムはありません」というエラーが表示されます。ポストビューで。

4

3 に答える 3

1

まずその理由として、

「キー 'IDNumbers' を持つタイプ 'IEnumerable' の ViewData アイテムはありません。」

なぜなら、このDropdownListは ViewBag/ViewData からのデータを name = でバインドするからです。"IDNumbers"

[Post]Action にViewbag.IDNumbersがありません! =>そのため、そのエラーが発生しました。

ソリューション:

1.データを受け取ったら、[GET] ProductById にリダイレクトします。

[HttpGet]
public ActionResult ProductById(int iMyCode)
{
    ViewBag.IDNumbers = ddlItems;//set your default value here
    return View();
}

Query String2.フォームを送信する代わりに、URL を使用してページをリロードします。

3. Javascript でクライアント側にデフォルト値 (ドロップダウン リスト) を設定し、AJAX を介してサーバーから追加データを取得します。これらの値を Cookie/Session/Query String で保存します。

これが役立つことを願っています

于 2013-02-19T02:13:02.067 に答える
0

あなたの例の問題:

  1. 何を達成しようとしているのかはわかりませんが、ASP.NET Web フォームの「ポストバック」モデルに行き詰まっているようです。DDL が変更されるたびにフォームを送信する必要はありません。より良い方法は、製品 ID を AJAX 経由でサーバーに渡し、応答を処理することです。
  2. 使用しないでくださいFormCollection。ViewModel を使用して View 内のそれにバインドし、それを[HttpPost]アクション メソッドのパラメーターとして受け入れます。
  3. @Html.DropDownListを使用しないでください。 は、ViewModelの型のプロパティになり@Html.DropDownListFor(model => model.SomeDDl)ます(上記の 2) に関連します)。SomeDddlSelectList

それで、おそらくあなたが達成しようとしていることを説明してください.

于 2013-02-19T01:17:50.720 に答える
0

これはViewBag、ドロップダウンリストの値を保存するために を使用しているために発生します。

代わりに、モデル プロパティを使用して Dropdownlist をバインドする場合は、データを投稿しても、DropDownList データを失う方法はありません。

したがって、答えはViewBag.IDNumbers = ddlItems、投稿でも使用することです。

[HttpPost]
public ActionResult ProductById(FormCollection formdata)
{
    ViewBag.IDNumbers = ddlItems; //Set the ViewBag items 
    string selected = formdata["IDNumbers"];
    int id = int.Parse(selected);
    Product p = items.GetByID(id);
    return View(p);
}
于 2013-02-19T05:42:17.380 に答える