ASP. NET MVC разрешить ввод сбора и передавать данные в пост - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть сущность для интервью и сущность для InterviewRespondent (лица, с которым проводятся интервью), которая связана с объектом Interview через InterviewId. У меня должен быть хотя бы один респондент при создании нового интервью. Мне было интересно, как можно разрешить ввод нескольких объектов InterviewRespondent без жесткого кодирования полей ввода для кратных в представлении, а затем передать эти данные коллекции в действие «Создать» для моего интервью, чтобы при публикации интервью было добавлено Интервью с моей базой данных, а затем l oop через список 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; }

1 Ответ

0 голосов
/ 13 апреля 2020

Как оказалось, мне нужно было использовать переменную 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.

Надеюсь, это поможет кому-то, кто хочет получить коллекцию связанных объектов. к другому главному объекту перед созданием их основного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...