Как добавить значения из radiobutton Dynami c в базу данных - PullRequest
0 голосов
/ 31 марта 2020

Краткий обзор

Я пытаюсь собрать данные с динамически создаваемых радиокнопок и добавить их в базу данных на страницах бритв.

Проблема

Содержимое веб-страницы создается динамически из файла. json. Пользователь может взаимодействовать с контентом, в основном, для нажатия различных значений радиокнопок. Эта часть работает как задумано. Проблема заключается в том, как передать значения, созданные пользователем, в базу данных. Когда пользователь нажимает кнопку отправки, веб-сайт должен:

  1. Найти все ранее сформированные радиокомпоненты
  2. Для каждой формы проверить, какое значение пользователь нажал
  3. Отправьте эти значения в базу данных для хранения ответов от разных пользователей

Это видео частично объясняет, что я хотел бы сделать, но я не знаю, как это сделать на страницах бритвы и для динамических c content: https://www.youtube.com/watch?v=QsvueWGmWLI

Если проблема с Dynami c является проблемой, я готов жестко закодировать все значения, чтобы иметь возможность их добавить.

Справочная информация: подробно

Основная цель веб-страницы c состоит в том, чтобы пользователи go посещали веб-страницу, отвечали в основном на вопросы с переключателями, а затем нажимали кнопку отправки. Затем веб-страница должна хранить их ответы в базе данных.

У меня есть два типа данных: Вопрос и Ответ Цель модели Ответа - хранить ответы. Цель модели Вопросов - динамически генерировать вопросы о радиокнопках на веб-странице.

Answer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;

namespace EvaluationTool.Models
{
    public class Answer
    {
        public int ID { get; set; }
        public string JobTitle { get; set; }

        [DataType(DataType.Date)]
        public DateTime Date { get; set; }
        public int O1 { get; set; }
        public int OC1 { get; set; }
        public int O2 { get; set; }
        public int OC2 { get; set; }
        public int O3 { get; set; }
        public int OC3 { get; set; }
    }
}

Question.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;

namespace EvaluationTool.Models
{
    public class Question
    {
        [JsonPropertyName("id")]
        public int Id { get; set; }

        [JsonPropertyName("isFollowUp")]
        public bool IsFollowUp { get; set; }

        [JsonPropertyName("followUpId")]
        public int FollowUpId { get; set; }

        [JsonPropertyName("statement")]
        public string Statement { get; set; }

        [JsonPropertyName("option1")]
        public string Option1 { get; set; }
        [JsonPropertyName("option2")]
        public string Option2 { get; set; }
        [JsonPropertyName("option3")]
        public string Option3 { get; set; }
        [JsonPropertyName("option4")]
        public string Option4 { get; set; }
        [JsonPropertyName("option5")]
        public string Option5 { get; set; }
        [JsonPropertyName("isCrit1")]
        public bool IsCritical1 { get; set; }
        [JsonPropertyName("isCrit2")]
        public bool IsCritical2 { get; set; }
        [JsonPropertyName("isCrit3")]
        public bool IsCritical3 { get; set; }
        [JsonPropertyName("isCrit4")]
        public bool IsCritical4 { get; set; }
        [JsonPropertyName("isCrit5")]
        public bool IsCritical5 { get; set; }

        [JsonPropertyName("value1")]
        public int Value1 { get; set; }
        [JsonPropertyName("value2")]
        public int Value2 { get; set; }
        [JsonPropertyName("value3")]
        public int Value3 { get; set; }
        [JsonPropertyName("value4")]
        public int Value4 { get; set; }
        [JsonPropertyName("value5")]
        public int Value5 { get; set; }

        [JsonPropertyName("result1")]
        public string Result1 { get; set; }
        [JsonPropertyName("result2")]
        public string Result2 { get; set; }
        [JsonPropertyName("result3")]
        public string Result3 { get; set; }
        [JsonPropertyName("result4")]
        public string Result4 { get; set; }
        [JsonPropertyName("result5")]
        public string Result5 { get; set; }

        public override string ToString() => JsonSerializer.Serialize<Question>(this);
    }
}

Вопросы создаются путем чтения json -файла, в котором хранятся вопросы. Пример с одной записью приведен здесь: Вопросы. json (неполные)

[
  {
    "id": 1,
    "isFollowUp": false,
    "followUpId": 2,
    "statement": "1. Workenvironment is not hazardous.",
    "option1": "Completely disagree",
    "option2": "Somewhat disagree",
    "option3": "Neutral",
    "option4": "Somewhat agree",
    "option5": "Completely agree",
    "isCrit1": true,
    "isCrit2": true,
    "isCrit3": true,
    "isCrit4": true,
    "isCrit5": false,
    "value1": 1,
    "value2": 2,
    "value3": 3,
    "value4": 4,
    "value5": 5,
    "result1": "You answered 1",
    "result2": "You answered 2,
    "result3": "You answered 3",
    "result4": "You answered 4",
    "result5": "You answered 5"
  },

На странице указателей, которая должна показать вопросы и собрать ответы, которые мне удалось сделать, Прочитайте файл. json и правильно отобразите все радиокнопки. Эта часть, возможно, немного сложна и не является частью проблемы, но есть два типа вопросов о радиокнопках: обычные вопросы (которые видны с самого начала) и до 1 дополнительного вопроса на обычный вопрос (которые не видны до на соответствующий обычный вопрос приходит ответ, который требует продолжения). Когда пользователь отвечает на вопрос о радиокнопке, запускается скрипт (function radioDisplay(id, followUpId, textResult, isCrit)). Он найдет, какая кнопка была нажата, найдет соответствующее значение результата и отобразит его в метке. Например, если пользователь нажал кнопку «option1», будет показан соответствующий текст «result1». Он также проверяет, есть ли дополнительный вопрос (если «followUpId» не равен -1, есть дополнительный вопрос). Если есть дополнительный вопрос и кнопка критична (в приведенном здесь примере для «option1» соответствующее значение «isCrit1» истинно, поэтому следующий вопрос будет найден и сделан видимым).

Когда пользователь нажал кнопку отправки, должно произойти то, что для каждой созданной радиокнопки формы должно быть определено, какое значение нажато, и это значение должно быть добавлено к записи в базе данных. Значения O1, OC1, O2, OC2, O3, OC3 в Answer.cs соответствуют вопросу. В файле вопросов есть 6 вопросов. json, так что по одному на каждое значение в файле Answer.cs (когда это сработает, будет добавлено больше). Таким образом, запрос на добавление к базе данных должен иметь идентификатор пользователя (ключ для базы данных, который может быть сгенерирован посредством итерации), строка JobTitle будет представлять собой текстовое поле, не являющееся динамическим c, добавленное позже, и следующие 6 значений получат их значения из radiobuttonforms.

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

Index.cs html

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h3>Evaluation Tool</h3>
</div>

@foreach (var question in Model.Questions)
{
    @if (question.IsFollowUp)
    {
        <p style="display:inline;display:none" name="@question.Id">@question.Statement</p>
        <br />
        <input style="display:none" id="option1" type="radio" name="@question.Id" value=@question.Value1 onclick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result1', '@question.IsCritical1')" />
        <p style="display:inline;display:none" name="@question.Id">@question.Option1</p>
        <br />
        <input style="display:none" id="option2" type="radio" name="@question.Id" value=@question.Value2 onClick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result2', '@question.IsCritical2')" />
        <p style="display:inline;display:none" name="@question.Id">@question.Option2</p>
        <br />
        <input style="display:none" id="option3" type="radio" name="@question.Id" value=@question.Value3 onClick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result3', '@question.IsCritical3')" />
        <p style="display:inline;display:none" name="@question.Id">@question.Option3</p>
        <br />
        <input style="display:none" id="option4" type="radio" name="@question.Id" value=@question.Value4 onClick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result4', '@question.IsCritical4')" />
        <p style="display:inline;display:none" name="@question.Id">@question.Option4</p>
        <br />
        @if (question.Option5 != "")
        {
            <input style="display:none" id="option5" type="radio" name="@question.Id" value=@question.Value5 onClick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result5', '@question.IsCritical5')" />
            <p style="display:inline;display:none" name="@question.Id">@question.Option5</p>
            <br />
        }
        <label style="display:none" id="label" name="@question.Id" class="@question.Id"></label>
        <br />

    }
    @if (!question.IsFollowUp)
    {
        <p style="display:inline" name="@question.Id">@question.Statement</p>
        <br />
        <input id="option1" type="radio" name="@question.Id" value=@question.Value1 onclick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result1', '@question.IsCritical1'.toLowerCase())" />
        <p style="display:inline" name="@question.Id">@question.Option1</p>
        <input id="option2" type="radio" name="@question.Id" value=@question.Value2 onClick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result2', '@question.IsCritical2'.toLowerCase())" />
        <p style="display:inline" name="@question.Id">@question.Option2</p>
        <input id="option3" type="radio" name="@question.Id" value=@question.Value3 onClick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result3', '@question.IsCritical3'.toLowerCase())" />
        <p style="display:inline" name="@question.Id">@question.Option3</p>
        <input id="option4" type="radio" name="@question.Id" value=@question.Value4 onClick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result4', '@question.IsCritical4'.toLowerCase())" />
        <p style="display:inline" name="@question.Id">@question.Option4</p>
        <input id="option5" type="radio" name="@question.Id" value=@question.Value5 onClick="radioDisplay(@question.Id, @question.FollowUpId, '@question.Result5', '@question.IsCritical5'.toLowerCase())" />
        <p style="display:inline" name="@question.Id">@question.Option5</p>
        <br />
        <label id="label" name="@question.Id" class="@question.Id"></label>
        <br />
    }
}

<button id="sub_but" type="button" value="Submit" class="btn-success" onclick="submitResults();">Submit</button>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
    function radioDisplay(id, followUpId, textResult, isCrit) {
        var resultLabel;
        var items = document.getElementsByName(id);
        for (i = 0; i < items.length; i++) {
            if (items[i].id == "label") {
                resultLabel = items[i];
            }
        }
        resultLabel.innerHTML = textResult;
        if (followUpId != -1) {
            if (isCrit == "true") {
                var followItems = document.getElementsByName(followUpId);
                for (i = 0; i < followItems.length; i++) {
                    followItems[i].style.display = 'block';
                    followItems[i].style.display = 'inline';
                }
            }
            else if(isCrit == "false") {
                var followItems = document.getElementsByName(followUpId);
                for (i = 0; i < followItems.length; i++) {
                    followItems[i].style.display = 'none';
                }
            }
        }
    }
    function submitResults() {
        //TODO: First create an array to store answers in
        @
        {
            string[] answers = new string[Model.Questions.length];
        }
        //TODO: Then loop through the dyanamically created forms, one for each question in Questions.
        @foreach(var question in Model.Questions)
        {
            //TODO: Find the value of the form and add it to answers
        }
        //TODO: Make a post to the database with all the values
    }
</script>
...