Передайте заполненную 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, но похоже, что она инициализируется конструктором по умолчанию. Если это даже невозможно, я буду работать над другим решением, но подумал, чтобы проверить, что я что-то упускаю.