我有一个页面,它通过 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,但它看起来像是使用默认构造函数初始化的。如果这甚至不可能,我将努力寻找不同的解决方案,但想检查我是否遗漏了任何东西。