Передайте заполненную MVC viewmodel в действие контроллера через вызов jquery AJAX

У меня есть страница, которая с помощью метода действия GET заполняет сложную модель представления, которая имеет много свойств и мало объектов LIST.

var model = new SelectTargetingViewModel(signupService, orderSignupItem, creativeTemplateId, cultureName, false, dealerMedias.ToList());

Затем я заполняю данные с помощью вызова AJAX, который сейчас вызывает тот же код, что и выше.

[HttpPost]
    [Route("~/selecttargeting/getdealermediarates")]
    public ActionResult GetDealerMediaRates(int ordersignupitemId, int? creativeTemplateId)
    {
        appContext.MenuAction = "DealerMediaIndex";
        appContext.MenuController = "Signup";

        string cultureName = "en";

        appContext.SetMenuParametersFromContext();

        var orderSignupItem = signupService.GetOrderSignupItemById(ordersignupitemId);

        var dealermedias = signupService.GetDealerMedias(orderSignupItem.OrderSignupDetail.Order.DealerId, orderSignupItem.OrderSignupDetail.Order.SeasonId, orderSignupItem.PackageMediaType.SeasonMediaType.ClientMediaTypeId);

        var model = new SelectTargetingViewModel(signupService, orderSignupItem, creativeTemplateId, cultureName, false, dealermedias.ToList());

        return PartialView("_GetDealerMediaRate", model);
    }

Затем вызовите метод через AJAX.

$.ajax({
            url: '@Url.Action("GetDealerMediaRates", "Signup", new { cultureName = Model.CurrentCultureName })?ordersignupitemId=@Model.OrderSignupItemId&creativeTemplateId=@Model.CreativeTemplateId',
            type: "POST",
            dataType: "html",
            success: function (data) {
                var newHtml = $(data);
                $('.dealermediarates').html(newHtml);
                oTable = $('#targetingtable').DataTable({
                    'aoColumnDefs': [{
                        'bSortable': false,
                        'aTargets': ['nosort']
                    }],
                    'order': [[1, 'asc']],
                    'aLengthMenu': [[10, 25, 50, 100, 150, -1], [10, 25, 50, 100, 150, "All"]],
                    processing: true,
                    "language":
                    {
                        "processing": "<div style='position: fixed; top: 50%; left: 50%; width: 250px; height: 80px; background-color: #fff; text-align: center; z-index: 10; outline: 0 0 0 9999px solid rgba(0, 0, 0, 0.5); border: 1px solid #aaa; padding: 10px 5px;'><i class='fa fa-spinner fa-spin'></i> Processing...Please wait</div>"
                    }
                });
                oSettings = oTable.settings();
                $('.targetingarea').unblock();
            }
        });

Это работает, но требует больше времени, чтобы попытаться заполнить модель дважды. Я нахожусь в процессе оптимизации процесса, поэтому вместо того, чтобы заполнять основную модель дважды, я хочу заполнить ее только один раз, а затем перейти к методу публикации AJAX. До сих пор я пытался получить модель и передать эту модель как переменную в вызове моего метода, но когда я отлаживаю код, все, что я вижу в своей модели, выглядит как конструктор по умолчанию, все, что было инициализировано с помощью действия get страницы метод, значений больше нет. Прежде всего, возможно ли вообще взять модель представления и передать ее методу со всеми свойствами и значениями, как если бы вы выполняли HTTP POST? Я что-то упустил в коде ниже.

AJAX CALL

var model = @Html.Raw(@JsonConvert.SerializeObject(@Model));
        var datatosend = JSON.stringify(model);
        $.ajax({
            url: '@Url.Action("GetDealerMediaRates", "Signup")',
            type: "POST",
            data: datatosend,
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            dataType: "html",
            success: function (data) {
                var newHtml = $(data);
                $('.dealermediarates').html(newHtml);
                oTable = $('#targetingtable').DataTable({
                    'aoColumnDefs': [{
                        'bSortable': false,
                        'aTargets': ['nosort']
                    }],
                    'order': [[1, 'asc']],
                    'aLengthMenu': [[10, 25, 50, 100, 150, -1], [10, 25, 50, 100, 150, "All"]],
                    processing: true,
                    "language":
                    {
                        "processing": "<div style='position: fixed; top: 50%; left: 50%; width: 250px; height: 80px; background-color: #fff; text-align: center; z-index: 10; outline: 0 0 0 9999px solid rgba(0, 0, 0, 0.5); border: 1px solid #aaa; padding: 10px 5px;'><i class='fa fa-spinner fa-spin'></i> Processing...Please wait</div>"
                    }
                });
                oSettings = oTable.settings();
                $('.targetingarea').unblock();
            }
        });

ПОЛУЧИТЬ метод на контроллере

[HttpPost]
    [Route("~/selecttargeting/getdealermediarates")]
    public ActionResult GetDealerMediaRates(SelectTargetingViewModel model)
    {
        appContext.MenuAction = "DealerMediaIndex";
        appContext.MenuController = "Signup";

        return PartialView("_GetDealerMediaRate", model);
    }

Когда я отлаживаю и смотрю на модель ниже в методе POST, я вижу, что модель не равна NULL, но похоже, что она инициализируется конструктором по умолчанию. Если это даже невозможно, я буду работать над другим решением, но подумал, чтобы проверить, что я что-то упускаю.

0 ответов

Другие вопросы по тегам