1

我有一个页面,它通过 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 post 方法。到目前为止,我尝试的是获取模型并在我的方法调用中将此模型作为变量传递,但是当我调试代码时,我在模型中看到的只是一个默认构造函数,任何使用页面获取操作初始化的东西方法,值不再存在。首先,这是否可以获取视图模型并将其传递给具有所有属性和值的方法,就像您正在执行 HTTP POST 一样?我是否在下面的代码中遗漏了任何内容。

AJAX 调用

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();
            }
        });

控制器上的 GET 方法

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

        return PartialView("_GetDealerMediaRate", model);
    }

当我在 POST 方法中调试并查看下面的模型时,我看到模型不是 NULL,但它看起来像是使用默认构造函数初始化的。如果这甚至不可能,我将努力寻找不同的解决方案,但想检查我是否遗漏了任何东西。

4

0 回答 0