1

データベースに追加される新しい会社を作成するこのビューがあります。ビューは、左側と右側の 2 つのセクションに分かれています。右側には、その会社の取引を入力したいと思います。会社は 1 つ以上の取引を持つことができ、これには 1 つの主要な取引と 0 からその他の多くの取引が含まれます。ユーザーが他の取引を追加すると、各取引が下のリストに追加されます。このためのコードはまだ入れていません。リスト内の各取引について、彼はそれを削除するオプションを持つことができます。すべての詳細を入力したら、[送信] をクリックすると、すべてのデータがデータベースに保存されます。現在、他の取引の部分ビューを入れようと考えていますが、どうすればいいのか疑問に思っており、オートコンプリートから取引が選択されるたびに、データがコントローラー メソッドにポストされ、部分ビューが返されます。ただし、これにより左側のセクションのデータがクリアされます。では、これをどのように行うべきですか?私のビューは次のようになります

@model SCD.ViewModels.SubcontractorViewModel

@{
    ViewBag.Title = "Create";
}

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Create Subcontractor</legend>
        <section class="wrapper">
            <section class="leftside">
                <table class="formTable">
                    <tr>
                        <td class="leftCell">@Html.LabelFor(model => model.Subcontractor.CompanyName)</td>
                        <td class="rightCell">@Html.TextBoxFor(model => model.Subcontractor.CompanyName, new { @style = "width: 300px;" })</td>
                    </tr>
                    <tr>
                        <td class="leftCell">@Html.LabelFor(model => model.AddressViewModel.Address1)</td>
                        <td class="rightCell">@Html.TextBoxFor(model => model.AddressViewModel.Address1, new { @style = "width: 300px;" })</td>
                    </tr>
                    <tr>
                        <td colspan="2" style="text-align: center;" class="rightCell"><input type="submit" value="Save"/></td>
                    </tr>
                </table>
                <div style="float: left">@Html.ActionLink(" ", "List", null, new { @class = "buttonBackToList" })</div>
            </section>
            <section class="rightside">
                <table class="formTable">
                    <tr>
                        <td class="leftCell">@Html.LabelFor(model => model.PrimaryTrade)</td>
                        <td class="rightCell"><input type="search" name="searchPrimaryTrade" id="searchPrimaryTrade" data-scd-autocomplete="@Url.Action("AutocompletePrimaryTrade", "DataService")" style = "width: 300px;"/>
                            <input type="button" id="ResetPrimaryTrade" value="Reset"/>
                        </td>
                    </tr>
                    <tr>
                        <td class="leftCell">@Html.LabelFor(model => model.OtherTrades)</td>
                        <td class="rightCell"><input type="search" name="searchOtherTrade" id="searchOtherTrade" data-scd-autocomplete="@Url.Action("AutocompleteOtherTrade", "DataService")" style = "width: 300px;"/>
                            <input type="button" id="ResetOtherTrade" value="Reset"/>
                        </td>
                    </tr>
                </table>
            </section>
        </section>

    </fieldset>
}
4

1 に答える 1

2

ページをリロードしたくない場合はいつでも、クライアント側の ajax を使用してサーバーと通信することが唯一の選択肢です

jQueryを使用するか、ajaxを介して行を追加します。これにより、行がデータベースに挿入され、入力されたモデルが再び返され、これがPartialView(). ajax は次のようになりonSuccessます: tableID を返された結果に置き換えます。

したがって、jQuery は次のようになります。

$('.rightside').children('.formTable').replaceWith(theReturnedPartialFromAjaxCall);

動的な行を追加する場合、次の 2 つのオプションがあります。

行を追加する際に ajax リクエストを呼び出すことができます。これにより、データベースに空白の行が追加され、モデルが再作成されて部分ビューが返されます。これにより、新しい空白行にモデル バインディングが配置され、空白行を削除するか、行に ID があるため、任意の行を ajax で削除することもできます。ただし、各行をループするときは、ID を隠しフィールドとして入れてください。

または(推奨される方法ではありませんが、保存を実行する必要があるため、おそらく何をする必要がありますか)

保存時にフォーム コレクションをキャプチャできます。複数の行がある場合は、これを配列に格納します。

public ActionResult Save(MyModel model, FormCollection frm) {
    String[] name = frm["name"].Split(',');
}

エラーが発生しやすく、最初の方法ではMVCのモデル検証をバインドできるため、この方法は好きではありません

于 2013-01-07T11:50:20.793 に答える