Привязка данных для коллекций в Create View ASP.NET MVC - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь добавить функцию опроса в свое веб-приложение ASP.NET MVC 5, чтобы пользователи могли создавать опросы с пользовательскими вопросами для отправки другим пользователям.Проблема в том, что у меня проблемы с разрешением пользователям добавлять вопросы в опрос в представлении «Создать опрос».

Я видел способы сделать это в представлении «Изменить», когда экземпляр моделиуже создан, но я хочу, чтобы пользователь мог создавать вопросы для опроса до добавления опроса в базу данных.

Это моя модель опроса:

public class Survey
    {
        public int SurveyId { get; set; }

        public string Name { get; set; }

        public string Author { get; set; }

        public DateTime StartDate { get; set; }

        public DateTime EndDate { get; set; }

        public List<Question> Questions { get; set; }

        public List<Response> Responses { get; set; }
    }

и этомоя модель вопроса:

public class Question
    {
        public int QuestionId { get; set; }

        public int SurveyId { get; set; }

        public string Title { get; set; }

        public string Body { get; set; }

        public QuestionType QuestionType { get; set; }

        public DateTime CreatedOn { get; set; }

        public DateTime LastModified { get; set; }

        public List<Answer> Answers { get; set; }
    }

Честно говоря, код, который я сейчас имею в Create.cshtml, является мусором, потому что я действительно не знаю, с чего начать, но здесь он в любом случае:

<h2>Create</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Survey</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Author, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Author, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Author, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.StartDate, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.StartDate, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.StartDate, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.EndDate, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.EndDate, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.EndDate, "", new { @class = "text-danger" })
            </div>
        </div>

        <h4 class="well well-small">
            Questions
        </h4>

        <button class="toggle-add-question" data-target="#add-question" data-toggle="modal" type="button">
            <i class="icon-plus"></i> Add Question
        </button>

        <div class="modal" id="add-question" tabindex="-1">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h3>Add Question</h3>
            </div>
            <div class="modal-body">
                <div class="row">
                    <form method="post">
                        <fieldset>
                            <div class="form-group">
                                <label for="Title">Title</label>
                                <input type="text" id="Title" name="Title" data-bind="value: title" />
                            </div>
                            <div class="form-group">
                                <label for="Type">Type</label>
                                <select id="Type" name="Type" data-bind="value: type">
                                    <option>Yes/No</option>
                                    <option>Number</option>
                                </select>
                            </div>
                        </fieldset>
                        <div class="form-group">
                            <div class="col-md-offset-2 col-md-10">
                                <input type="submit" value="Create" class="btn btn-default" data-dismiss="modal" />
                            </div>
                        </div>
                    </form>
                </div>
                <div class="row">
                    <div class="span6">
                        <textarea id="Body" name="Body"></textarea>
                    </div>
                </div>
            </div>
        </div>

        <table class="table">
            <tr>
                <th>
                    Question Title
                </th>
                <th>
                    Question Body
                </th>
                <th>
                    Question Type
                </th>
            </tr>
            @if (Model.Questions != null)
            {
                for (var i = 0; i < Model.Questions.Count(); i++)
                {
                    <tr>
                        @Html.HiddenFor(x => Model.Questions[i].QuestionId)
                        <td>
                            @Html.TextBoxFor(x => Model.Questions[i].Title)
                        </td>
                        <td>
                            @Html.TextBoxFor(x => Model.Questions[i].Body)
                        </td>
                        <td>
                            @Html.TextBoxFor(x => Model.Questions[i].QuestionType)
                        </td>
                    </tr>
                }
            }
        </table>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

Я хочу, чтобы пользователь мог нажать кнопку «Добавить вопрос», чтобы всплыли модальные поля с вопросами, а затем чтобы пользователь мог нажать «сохранить» и выйти из режима.и новый вопрос появится в таблице.Прямо сейчас я получаю сообщение об ошибке, что ссылка на объект не установлена ​​на экземпляр объекта, что имеет смысл, потому что объект Survey еще не был создан, но я не уверен, как сделать это по-другому.(Без таблицы появляется модальное представление и все, но без вопросов).

Любая помощь будет принята с благодарностью, спасибо!

1 Ответ

0 голосов
/ 12 июня 2019

Вы можете обновить таблицу при сохранении модального всплывающего окна, комбинируя AJAX и частичные представления (далее называемые частями).

Таблица, содержащая данные вашего вопроса, может располагаться в частичном виде с собственным представлениеммодель, которая принимает вопросы, которые вы хотите представить.Вы можете оставить разметку как есть.

На вашей странице, где сейчас находится таблица, замените ее содержащим div с частичной внутренней частью.

Когда вы сохраняете модал, который добавляет новый вопрос, вы можете использовать AJAXвызов (триггер по щелчку), чтобы поразить ваш контроллер, сохранить новую запись вопроса (с любой необходимой вам проверкой) и вернуть частичную таблицу с новой моделью представления, заполненной вопросами в вашей БД (которая будет включать в себя только что сохраненный вами новый)).

При успешном обратном вызове вызова AJAX заполните контейнер div новой моделью частичного представления и представления, затем закройте всплывающее окно.Страница покажет новый вопрос в таблице, не пройдя весь цикл страницы.

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