0

ユーザーがドロップダウン リストを作成し、項目を動的に追加できるようにする ASP MVC 3 ページがあります。たとえば、これはページが最初にロードされたときの外観です。

ここに画像の説明を入力

左側の情報は、ドロップダウン リストを配置するページ ( Navbar Item) と、ドロップダウン リストに付ける名前 (明らかにDrop Down List Name) を指定するために使用されます。

右側 (Allowed ValueおよびDisplay Value) の情報は、特定のドロップダウン リスト項目になります。ユーザーがAdd Anotherリンクをクリックすると、Ajax 呼び出しがコントローラーに送られ、部分的なビューが返され、次のDrop Down Items <fieldset>ように追加されます。

ここに画像の説明を入力

問題は、ユーザーがSubmitボタンを押すと、どのアイテムもコントローラーに到達しないことです。

私はまだASP MVCに比較的慣れていないので、これが正しい方法であるかどうか疑問に思っています。これはリストに項目を動的に追加する適切な方法ですか?

このビューがコントローラーで最初に作成された方法は次のとおりです

    public ActionResult NewList()
    {
        List<DropDownValues> drop = new List<DropDownValues>();
        drop.Add(new DropDownValues());

        return View(drop);
    }

タイプのリストDropDownValuesが作成され、このタグが上部にあるビューに送信されます

@model IEnumerable<Monet.Models.DropDownValues>

以下の Ajax 呼び出し

<script>
    $(document).ready(function () {
        $("#addItem").click(function () {
            if ($('#Field').text() != "" && $('#DisplayPage').text() != "") {
                $.ajax({
                    url: '@Url.Action("BlankDropDownItem", "DropDownValues")',
                    data: { field: $('#Field').val(), displayPage: $('#DisplayPage').val() },
                    dataType: 'html',
                    cache: false,
                    success: function (html) {
                        $("#items").append(html);
                    }
                });
            } else {
                alert("Please enter a Drop Down List Name and Navbar Item first!");
            }
            return false;
        });
    });
</script>

このコントローラーメソッドを呼び出します

    public ActionResult BlankDropDownItem(string field, string displayPage)
    {
        DropDownValues partial = new DropDownValues();
        partial.Field = field;
        partial.DisplayPage = displayPage;

        return PartialView("DropDownItemPartial", partial);
    }

次に、この部分ビューをメイン ページに追加します

@model Monet.Models.DropDownValues


@Html.HiddenFor(model => model.Field)
@Html.HiddenFor(model => model.DisplayPage)

<div class="editor-label">
    @Html.LabelFor(model => model.AllowedValue)
</div>
<div class="label-field">
    @Html.EditorFor(model => model.AllowedValue)
    @Html.ValidationMessageFor(model => model.AllowedValue)
</div>
<div class="editor-label">
    @Html.LabelFor(model => model.DisplayValue)
</div>
<div class="label-field">
    @Html.EditorFor(model => model.DisplayValue)
    @Html.ValidationMessageFor(model => model.DisplayValue)
</div>

すべての新しいアイテムが正しい値でデータベースに保存されるようにするために、隠しフィールドを使用しようとしていFieldますNavbar Item(繰り返しますが、これが適切な方法であるかどうかはわかりません)。

アドバイス/提案をいただければ幸いです。どうも!

4

1 に答える 1

0

Steven Sanderson のBeginCollectionItemヘルパーを使用して支援できます: http://nuget.org/packages/BeginCollectionItem/

彼のブログ投稿では、WebForms ビュー エンジンを使用した原則について説明していますが、Razor にも同様に適用できます。 -スタイル/

同じ名前の入力フィールドのコレクションを送信する際の基本事項について知りたい場合は、Haack のブログ記事を読んでください: http://haacked.com/archive/2008/10/23/model-リストへのバインド.aspx

これがあなたにいくつかの指針を与えることを願っています!

于 2013-05-23T22:55:20.637 に答える