首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET MVC允许在post中输入收集和传递数据

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

Stack Overflow用户
提问于 2020-04-04 20:05:27
回答 1查看 34关注 0票数 0

我有一个面试实体和一个通过InterviewId绑定到面试对象的InterviewRespondent实体(被面试的人)。创建新面试时,我应该至少有一个应答者。我想知道如何在不对视图中的多个输入字段进行硬编码的情况下允许多个InterviewRespondent对象的输入,然后将收集的数据传递给我的面试的Create操作,以便在发布面试时将该面试添加到我的数据库中,然后循环遍历InterviewRespondent列表并使用新创建的面试InterviewId插入这些数据。

这是我的面试课:

代码语言:javascript
运行
复制
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类:

代码语言:javascript
运行
复制
public int InterviewRespondentId { get; set; }
public int InterviewId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
EN

回答 1

Stack Overflow用户

发布于 2020-04-14 04:23:34

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

代码语言:javascript
运行
复制
//Session variable
services.AddDistributedMemoryCache();
services.AddSession();

在Configure中:

代码语言:javascript
运行
复制
//Session variable
app.UseSession();

我在项目中添加了一个名为SessionExtensions的类,用于获取和设置会话变量:

代码语言:javascript
运行
复制
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帖子在单击按钮时添加受访者:

代码语言:javascript
运行
复制
$('#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函数,用于动态创建我的受访者表:

代码语言:javascript
运行
复制
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控制器中的代码:

代码语言:javascript
运行
复制
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创建他们:

代码语言:javascript
运行
复制
_repository.PostInterview(newInterview);

model.InterviewRespondentList = GetInterviewRespondents();

//Add InterviewRespondent
foreach (var respondent in model.InterviewRespondentList)
{
    respondent.InterviewId = newInterview.InterviewId;
    _repository.PostInterviewRespondent(respondent);
}

下面是我的GetInterviewRespondents()助手方法:

代码语言:javascript
运行
复制
    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;
    }

我还变得花哨起来,并允许在受访者仍在会话变量中时将其删除。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61027810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档