我有一个面试实体和一个通过InterviewId绑定到面试对象的InterviewRespondent实体(被面试的人)。创建新面试时,我应该至少有一个应答者。我想知道如何在不对视图中的多个输入字段进行硬编码的情况下允许多个InterviewRespondent对象的输入,然后将收集的数据传递给我的面试的Create操作,以便在发布面试时将该面试添加到我的数据库中,然后循环遍历InterviewRespondent列表并使用新创建的面试InterviewId插入这些数据。
这是我的面试课:
public int InterviewId { get; set; }
public string InterviewerId { get; set; }
public int InterviewTypeId { get; set; }
public DateTime InterviewDate { get; set; }
public string InterviewNoteDetail { get; set; }
下面是我的InterviewRespondent类:
public int InterviewRespondentId { get; set; }
public int InterviewId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
发布于 2020-04-14 04:23:34
事实证明,我需要使用一个会话变量来存储我的受访者列表。我以为我可以使用TempData,但它还不够健壮。我通过NuGet添加了会话,然后在ConfigureServices中的Startup.cs文件中添加了几行代码:
//Session variable
services.AddDistributedMemoryCache();
services.AddSession();
在Configure中:
//Session variable
app.UseSession();
我在项目中添加了一个名为SessionExtensions的类,用于获取和设置会话变量:
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
});
}
最后,在我的控制器中,一旦我创建了面试,我就会遍历会话变量中的受访者,并使用适当的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;
}
我还变得花哨起来,并允许在受访者仍在会话变量中时将其删除。
我希望这对那些想要在创建自己的主对象之前获得与其他主对象相关的对象集合的人有所帮助。
https://stackoverflow.com/questions/61027810
复制相似问题