Мне трудно инициализировать мастер начальной загрузки, сгенерированный динамически при частичном просмотре. Модель частичного просмотра генерирует значение Id, которое я сохраняю в статическую переменную, и я получаю доступ к этой статической переменной в моем обратном вызове ajax done, и она не обновляет ее значение. Это значение идентификатора статической переменной является частью идентификатора мастера начальной загрузки.
Я добавил службу для частичного просмотра строки и возврата строки вместе со значением id в виде объекта json.
htmlString = await this.RenderViewToStringAsync("_BlankEmployeeAssignment", new EmployeeAssignmentViewModel(), true);
return Json(new {html = htmlString, id = SettingsHelper.RecordIndex});
or
return Json(new { html = JsonConvert.SerializeObject(htmlString, Formatting.None), id = SettingsHelper.RecordIndex });
or
return Json(new { html = JsonConvert.SerializeObject(htmlString), id = SettingsHelper.RecordIndex });
Это работает, но проблема в том, что я не могу отобразить html, поскольку он содержит экранированные символы, которые jquery.parseHtml или JSON.parse не могут проанализировать обратно в чистый html. Поэтому я использую стандартную технику следующим образом, но проблема в том, чтобы получить обновленное значение SettingsHelper.RecordIndex, даже если я использую TempData ["RecordIndex"] = Model.RecordId;
return PartialView("_BlankEmployeeAssignment", new EmployeeAssignmentViewModel());
У меня есть абстрактный класс, содержащий все общие свойства
[BindRequired]
public abstract class AssetAssignmentViewModel
{
public string RecordId { get; set; } = Guid.NewGuid().ToString();
.... other properties
}
Этот класс наследует от абстрактного класса и добавляет его уникальные свойства навигации
public class EmployeeAssignmentViewModel : AssetAssignmentViewModel
{
...other unique properties
}
Я звоню в эту конечную точку, используя ajax
[Route("[action]", Name = "BlankEmployeeAssignment"), HttpGet("AddBlankEmployeeAssignment")]
public IActionResult AddBlankEmployeeAssignment()
{
return PartialView("_BlankEmployeeAssignment", new EmployeeAssignmentViewModel());
}
Внутри частичного представления _BlankEmployeeAssignment у меня есть следующий код, сохраняющий RecordId либо в TempData, либо в статическую переменную
@model EmployeeAssignmentViewModel
@{
ViewData["Icon"] = "fa fa-plus-square-o";
SettingsHelper.RecordIndex = Model.RecordId;
TempData["RecordIndex"] = Model.RecordId;
}
Я делаю вызов Ajax здесь
function addDynamicWizard(target, url, doneCallback) {
jQuery.ajax({
url: url,
method: "GET",
dataType: "html",
cache: false,
success: function (html) {
html = jQuery(html).hide().fadeIn(1000);
jQuery(target).append(html);
},
error: ajaxErrorHander
}).done(doneCallback);
return false;
}
Когда к контейнеру добавлено частичное представление, у меня есть обратный вызов функции done
function ajaxWizardDoneHandler(data)
{
pageSetUp();
var id = "@TempData["RecordIndex"]";
runBootstrapWizard('#bootstrap-wizard-' + "@SettingsHelper.RecordIndex",
runWizardFormValidator("#assignmentForm"));
}
И TempData, и статический SettingsHelper.RecordIndex содержат устаревшие значения, а не только что созданный RecordId, созданный при вызове AddBlankEmployeeAssignment.