通过jquery AJAX调用将填充的MVC视图模型传递给控制器​​操作

时间:2017-04-14 13:26:50

标签: jquery asp.net-mvc jquery-ajaxq

我有一个页面通过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方法。我到目前为止所尝试的是获取模型并将此模型作为变量传递给我的方法调用但是当我调试代码时,我在模型中看到的所有内容看起来都是默认构造函数,任何使用页面获取操作初始化的内容方法,价值不再存在。首先,这甚至可以采用viewmodel并将其传递给具有所有属性和值的方法,就像您正在进行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();
            }
        });

控制器上的GET方法

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

        return PartialView("_GetDealerMediaRate", model);
    }

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

0 个答案:

没有答案