Как оказалось, мне нужно было использовать переменную Session для хранения моего списка респондентов. Я думал, что смогу сойти с TempData, но он не был достаточно надежным. Я добавил Session через NuGet, а затем добавил несколько строк кода в мой файл Startup.cs в ConfigureServices:
//Session variable
services.AddDistributedMemoryCache();
services.AddSession();
И в Configure:
//Session variable
app.UseSession();
Я добавил класс в мой проект под названием SessionExtensions для получения и установки моей переменной Session:
public static class SessionExtensions
{
public static void SetObjectAsJson(this ISession session, string key, object value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static T GetObjectFromJson<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
}
Я использую запись $ ajax в своем представлении для добавления респондента по нажатию кнопки:
$('#uxAddRespondent').click(function () {
var fname = $('#uxFirstName').val();
var lname = $('#uxLastName').val();
$.ajax({
type: 'POST',
url: '@Url.Action("AddRespondent", "Interview")',
data: { firstName: fname, lastName: lname },
dataType: "json",
success: function (data) {
if (data.success) {
//Clear the inputs
$("#uxFirstName").val('');
$("#uxLastName").val('');
//Unhide the submit button and the Respondents div
$("#uxCancel").removeClass('offset-9');
$("#uxCancel").addClass('offset-6');
$("#uxSubmit").removeClass('d-none');
$("#uxRespondentsDiv").removeClass('d-none');
createRespondentTable(data.respondentList);
}
else {
$("<div title='Respondent Name'><span class='text-danger'>Invalid input.<br />Both First and Last Name must contain 2-50 characters.</span></div>").dialog();
}
}
});
});
У меня есть JS функция для динамического создания таблицы моих респондентов:
function createRespondentTable(data) {
//Clear the table content
$("#uxRespondentTable").empty();
//Create table content
var tablecontent = "<table class='table table-hover'>";
$.each(data, function (index, item) {
tablecontent += "<tr><td>" + item.interviewRespondentFirstName + " " +
item.interviewRespondentLastName + "</td>" +
"<td><button type='button' class='btn btn-secondary'" +
"id='removeRespondent_" + index + "'>Remove</button></td></tr>";
});
tablecontent += "</table>";
$("#uxRespondentTable").append(tablecontent);
}
Вот мой код в моем контроллере для AddRespondent:
public JsonResult AddRespondent(string firstName, string lastName)
{
if (firstName != null && firstName.Length > 1 && lastName != null && lastName.Length > 1)
{
var model = new InterviewRespondentViewModel
{
InterviewRespondentFirstName = firstName,
InterviewRespondentLastName = lastName
};
var respondentList =
HttpContext.Session.GetObjectFromJson<List<InterviewRespondentViewModel>>("InterviewRespondents");
if (respondentList == null)
{
List<InterviewRespondentViewModel> respList = new List<InterviewRespondentViewModel>();
respList.Add(model);
HttpContext.Session.SetObjectAsJson("InterviewRespondents", respList);
}
else
{
respondentList.Add(model);
HttpContext.Session.SetObjectAsJson("InterviewRespondents", respondentList);
}
var getRespList = HttpContext.Session.GetObjectFromJson<List<InterviewRespondentViewModel>>("InterviewRespondents");
ViewBag.HasRespondent = true;
return Json(new
{
success = true,
respondentList = getRespList
});
}
return Json(new
{
success = false
});
}
И, наконец, в моем контроллере один раз Я создаю Интервью, которое я затем l oop через респондентов из переменной Session, и создаю их с соответствующим InterviewId:
_repository.PostInterview(newInterview);
model.InterviewRespondentList = GetInterviewRespondents();
//Add InterviewRespondent
foreach (var respondent in model.InterviewRespondentList)
{
respondent.InterviewId = newInterview.InterviewId;
_repository.PostInterviewRespondent(respondent);
}
Вот мой вспомогательный метод для GetInterviewRespondents ():
private List<InterviewRespondent> GetInterviewRespondents()
{
//Get InterviewRespondent List
var respondentList =
HttpContext.Session.GetObjectFromJson<List<InterviewRespondentViewModel>>("InterviewRespondents");
//Convert the Respondents from Session "InterviewRespondents" into InterviewRespondent
List<InterviewRespondent> respondents = new List<InterviewRespondent>();
foreach (var respondent in respondentList)
{
respondents.Add(new InterviewRespondent
{
InterviewRespondentFirstName = respondent.InterviewRespondentFirstName,
InterviewRespondentLastName = respondent.InterviewRespondentLastName
});
}
return respondents;
}
Мне также показалось, что я могу удалить респондентов, пока они еще были в переменной Session.
Надеюсь, это поможет кому-то, кто хочет получить коллекцию связанных объектов. к другому главному объекту перед созданием их основного объекта.