1

コントローラーの別の部分ビュー内の複数の部分ビューの動的な数を返し、Ajax 呼び出しを使用してそれを DOM に挿入したいと考えています。ユーザーはパッケージ (ラジオ ボタン) を選択します。このパッケージに応じて、ユーザーが入力する X 個のフォームを返す必要があります。

これは私のAjaxコードです:

$(function() {
    var serviceURL = "/NewOrderRequestForms/GetFormsToCreateNewOrderRequest";

    $(":radio").change(function() {
        $.ajax({
            url: serviceURL,
            type: "POST",
            data: { account: $("#AccountId").val(), serviceAvailabilityPackageId: $(":radio:checked").val() },
            success: function(xhrData) {
                populateNORForms(xhrData);
            },
            error: function() {
            alert("error");
        }
        });
    });
});

私のコントローラーメソッドは次のようになります。

public virtual ActionResult GetFormsToCreateNewOrderRequest(Guid account, int serviceAvailabilityPackageId)
{
    var customerNumber = _authorizationUtil.GetAccount(account).CustomerNumber;
    var result = _customFormService.GetFormsToCreateNewOrderRequest(customerNumber.Value,
        serviceAvailabilityPackageId).Select(x => x.FormKey);

    var forms = CustomFormUtil.GetCustomMetaPartial(result);

    //I am confused here
    //return PartialView(something)
}

CustomFormUtil.GetCustomMetaPartial(result)IEnumerable<string>たとえば、「form1、form3」または「form1、form2、form3、form6」などの1から6の文字列を返します。これを使用して、ビュー名とモデルの辞書を返し、最終的な部分ビューに追加します.

//Dictionary for Custom Meta Partialviews
public static Dictionary<string, CustomMetaPartialViewModel> CustomMetaPartial2 = new Dictionary<string, CustomMetaPartialViewModel>() 
{
    {"form1_v1", new CustomMetaPartialViewModel(MVC.Service.NewOrderRequestForms.Views.form1_v1, new form1_v1())},
    {"form2_v1", new CustomMetaPartialViewModel(MVC.Service.NewOrderRequestForms.Views._form2_v1,new form2_v1())},
    ...
    {"form7_v1",  new CustomMetaPartialViewModel(MVC.Service.NewOrderRequestForms.Views._form7_v1,new form7_v1())}
};

私の質問は、モデルを含むこれらの部分ビューを別の大きな部分ビューに追加し、これをビューに戻すにはどうすればよいですか?

4

1 に答える 1

0

わかりました、Ajax を使用して文字列のリストを呼び出す代わりに、必要なものすべてをレンダリングする PartialView を作成するために、これに対する答えがあります。

これは私のAJAX呼び出しです

    $(function () {
    var serviceURL = "/NewOrderRequestForms/GetFormsToCreateNewOrderRequest";

    $(":radio").change(function () {
        $.ajax({
            url: serviceURL,
            type: "POST",
            data: { account: $("#AccountId").val(), serviceAvailabilityPackageId: $(":radio:checked").val() },
            success: function (xhrData) {
                $('#NORForms').html(xhrData);
            },
            error: function () {
                alert("error");
            }
        });
    });
});

そして、コントローラーの機能は次のとおりです。

        public virtual ActionResult GetFormsToCreateNewOrderRequest(Guid account, int serviceAvailabilityPackageId)
    {
        var customerNumber = _authorizationUtil.GetAccount(account).CustomerNumber;
        var result = _customFormService.GetFormsToCreateNewOrderRequest(customerNumber.Value,
            serviceAvailabilityPackageId).Select(x => x.FormKey);

        return PartialView(Views.GenericParentView, result);
    }

ビューから必要なすべての情報を取得していますが、Ajax のコールバックに文字列のリストを返す代わりに、パーシャルをレンダリングするために必要なパラメーターとして必要な文字列のリストを持つ PartialView を返しています。ビュー。これを処理する新しい部分ビューを次に示します。

    @using UI.Shared.Utils
@model IEnumerable<string>
    @{
        var forms = CustomFormUtil.GetCustomMetaPartial2(Model);
        var result = forms.Select(x => x.Model);  
    }


    @using (Html.BeginForm(MVC.Service.NewOrderRequest.Index(new TdlMasterModel()), FormMethod.Post))
        {
            foreach (var form in forms)
            {
                { Html.RenderPartial(form.View, form.Model); }
            }
            <p style="clear: both">
                <input id="submitNOR" type="submit" value="Submit" style="float: right" />
            </p>
        }

文字列のリストを送信し、それを使用してモデル、ビューを含む辞書を吐き出し、foreach ループを使用して部分ビューでそれらをレンダリングしています。最後にいくつかの余分な Ajax 呼び出しを節約しました。履歴書では、問題に間違った方法で取り組んでいました。

于 2015-03-06T22:30:14.353 に答える