ASP.NET MVC允许在post中输入集合和传递数据



我有一个面试实体和一个通过面试ID与面试对象联系在一起的面试被申请人实体。创建新的面试时,我应该至少有一个受访者。我想知道如何在不对视图中的多个输入字段进行硬编码的情况下允许输入多个面试响应者对象,然后将收集数据传递给我的面试创建操作,以便在发布面试时将面试添加到我的数据库中,然后循环浏览"受访者"列表,并将其与新创建的访谈的"受访者ID"一起插入。

这是我的面试课程:

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; }

这是我的受访者课程:

public int InterviewRespondentId { get; set; }
public int InterviewId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }

事实证明,我需要使用Session变量来存储我的响应者列表。我以为我可以使用TempData,但它不够健壮。我通过NuGet添加了Session,然后在ConfigureServices:中的Startup.cs文件中添加了几行代码

//Session variable
services.AddDistributedMemoryCache();
services.AddSession();

在配置:中

//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);
}

这是我在AddResponder控制器中的代码:

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
});
}

最后,在我的控制器中,一旦我创建了面试,我就会循环浏览Session变量中的受访者,并使用正确的面试Id创建他们:

_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;
}

我也很喜欢,允许在响应者仍在会话变量中时删除它们。

我希望这能帮助那些希望在创建主对象之前获得与其他主对象相关的对象集合的人。

最新更新