Установите оценки в базу данных после сдачи экзамена в ASP.NETCore 3.1 MVC

#c# #entity-framework #asp.net-core-mvc

#c# #entity-framework #asp.net-ядро-mvc

Вопрос:

Модель моего вопроса

  public class Question
{
    [Key]
    public int Id { get; set; }
    
    public string Title { get; set; }
    
    public string A { get; set; }

    public string B { get; set; }

    public string C { get; set; }

    public string D { get; set; }

    public int SubjectId { get; set; }
    public virtual Subject Subject { get; set; }

    public int AnswerId { get; set; }
    public virtual Answer Answer { get; set; }
}
 

и это мой взгляд.cshtml

  @foreach (var item in Model)
                {
                    <div>
                        @Html.DisplayFor(modelItem => item.Title)

                        <input type="radio" value="@Html.DisplayFor(modelItem => item.A)" id="A" name="@Html.DisplayFor(modelItem=> item.Id)" class="rb" />
                        @Html.DisplayFor(modelItem => item.A)
                        <input type="radio" value="@Html.DisplayFor(modelItem => item.B)" id="B" name="@Html.DisplayFor(modelItem=> item.Id)" class="rb" />
                        @Html.DisplayFor(modelItem => item.B)
                        <input type="radio" value="@Html.DisplayFor(modelItem => item.C)" id="C" name="@Html.DisplayFor(modelItem=> item.Id)" class="rb" />
                        @Html.DisplayFor(modelItem => item.C)
                        <input type="radio" value="@Html.DisplayFor(modelItem => item.D)" id="D" name="@Html.DisplayFor(modelItem=> item.Id)" class="rb" />
                        @Html.DisplayFor(modelItem => item.D)
                    </div>

                }
 

Итак, как я могу сравнить ответ пользователя с моим правильным ответом, а затем выставить оценку и сохранить ее в базе данных?

и это моя таблица, в которой должен храниться счет:

 public class StraintTest
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
    public string  FatherName { get; set; }
    public int Cost { get; set; }
    public string Contact { get; set; }
    public int Grammar { get; set; }
    public int Vocabulary { get; set; }
    public int Reading { get; set; }
    public int Listening { get; set; }
    public int Writing { get; set; }
    public int Speaking { get; set; }
    public string Exam_Date { get; set; }
    public int Score { get; set; }
    public int ProgramId { get; set; }
    public virtual Program Program { get; set; }
}
 

это самый быстрый сервис :

  public int AddStraintTest(StraintTestViewModel test)
    {
        var newStriant = new StraintTest()
        {
            Name = test.Name,
            LastName = test.LastName,
            FatherName = test.FatherName,
            Contact = test.Contact,
            Cost = test.Cost,
            Exam_Date = test.Exam_Date,
            Grammar = test.Grammar,
            Listening = test.Listening,
            Speaking = test.Speaking,
            Writing = test.Writing,
            Reading = test.Reading,
            ProgramId = test.ProgramId.HasValue ? test.ProgramId.Value:1,
            Score = test.Score

        };
        _context.Add(newStriant);
        _context.SaveChanges();
        return newStriant.Id;
        
    }
 

это контроллер StrainTest:

 [HttpPost]
    public IActionResult Create(StraintTestViewModel straintTest)
    {
        if (ModelState.IsValid)
        {
            int id = _istraintTest.AddStraintTest(straintTest);
            if (id > 0)
            {
                return RedirectToAction(nameof(Create));
            }
        }
        ViewBag.Program = new SelectList(_iprogram.GetProgram(), "Id", "Name");

        return View();
    }
 

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

и это моя операция по настройке оценки:

 public IActionResult TakeExam(int straintTestId)
    {
        var data = _iquestion.ShowQuestion();
        return View(data);
    }

    [HttpPost]
    public IActionResult TakeExam(IEnumerable<Question> Questions, int straintTestId)
    {
        ExamCheck examCheck;
        int score = 0;
        if(Questions != null)
        {
            foreach(Question Q in Questions)
            {
                examCheck = new ExamCheck();
                examCheck.StriantTestId = straintTestId;
                examCheck.QuestionID = Q.Id;
                examCheck.CorrectAnswer = Q.AnswerId;
                if(Q.SelectAnswer != null)
                {
                    examCheck.StudentAnswer = (int)Q.SelectAnswer;
                }
                else
                {
                    examCheck.StudentAnswer = 0;
                }
                _context.ExamChecks.Add(examCheck);
                _context.SaveChanges();
                if(Q.SelectAnswer == Q.AnswerId)
                {
                    score  = 1;
                }
            }
        }
        StraintTest straintTest = new StraintTest();
        straintTest.Id = straintTestId;
        straintTest.Score = score;

        _context.StraintTests.Add(straintTest);
        _context.SaveChanges();
        return View(straintTest);
    }
 

когда я нажимаю, он показывает вопросы, но не устанавливает оценку …!

было бы очень приятно, если бы кто-нибудь мне явно помог!!!

Комментарии:

1. Небольшое примечание: ваш первый код базы данных не определяет индексы, доступ к вашим данным будет осуществляться через сканирование таблицы. взгляните на базу данных с помощью профилирования SQL и посмотрите посмотрите на инструкции where и обновите свою модель

2. Спасибо, но я не понял, что именно вы имеете в виду …?

3. мой плохой, я думаю, взгляните на docs.microsoft.com/en-us/ef/core/modeling/indexes , когда бы вы ни подумали, что вам нужно отфильтровать поле данных, вам нужен индекс, в вашем случае ProgramId и такие поля, как Contact, поскольку я предполагаю, что вы ищете по нему

4. но там я сделал поле как programId

5. EF сгенерировал индекс? взгляните на свои планы выполнения базы данных и посмотрите, все ли идет хорошо use-the-index-luke.com/sql/explain-plan/sql-server/operations .

Ответ №1:

Я написал для вас простой тестовый код. Вы можете проверить это и реализовать самостоятельно. Это мой класс вопросов :

 public class Question
    {
        public string Tittle { get; set; }
        public string A { get; set; }
        public string B { get; set; }
        public string C { get; set; }
        public string D { get; set; }
        public bool OptA { get; set; }
        public bool OptB { get; set; }
        public bool OptC { get; set; }
        public bool OptD { get; set; }
    }
 

и это действие контроллера Get. Я создал случайные вопросы, не обращая на это внимания.

 public IActionResult test() {
            List<Question> list = new List<Question>() { 
                new Question { Tittle = "Asadasadasa", A = "asasas", B = "basasasasas", C = "casadsdfadsad", D = "dasadsdsd" },
                new Question { Tittle = "Asadasadasa", A = "asasas", B = "basasasasas", C = "casadsdfadsad", D = "dasadsdsd" },
                new Question { Tittle = "Asadasadasa", A = "asasas", B = "basasasasas", C = "casadsdfadsad", D = "dasadsdsd" },
                new Question { Tittle = "Asadasadasa", A = "asasas", B = "basasasasas", C = "casadsdfadsad", D = "dasadsdsd" },
                new Question { Tittle = "Asadasadasa", A = "asasas", B = "basasasasas", C = "casadsdfadsad", D = "dasadsdsd" },
                new Question { Tittle = "Asadasadasa", A = "asasas", B = "basasasasas", C = "casadsdfadsad", D = "dasadsdsd" },
            };
            return View(list);
        }
 

после этого это моя страница просмотра. Я использовал флажок для ввода, который позволяет использовать несколько вариантов, но для этого вы можете использовать option group.Я забываю добавить текст опций, но это тоже не имеет значения :).

 @model List<EpsilonMFALanguage.Help.Question> 


<div class="col-md-12">
    <div class="panel">
        <div class="panel-body">
            <form action="@Url.Action("test","Home")" method="post" class="form-horizontal">
                @for (int i=0;i<Model.Count;i  )
                {
                <div class="form-group">
                    <input type="hidden" asp-for="@Model[i].Tittle" />
                    <label id="lbl_@i" class="col-md-12" asp-for="@i">@Model[i].Tittle</label>
                    <div class="col-md-6">
                        <input type="checkbox" id="@i" asp-for="@Model[i].OptA" />
                    </div>
                    <div class="col-md-6">
                        <input type="checkbox" id="@i" asp-for="@Model[i].OptB" />
                    </div>
                    <div class="col-md-6">
                        <input type="checkbox" id="@i" asp-for="@Model[i].OptC" />
                    </div>
                    <div class="col-md-6">
                        <input type="checkbox" id="@i" asp-for="@Model[i].OptD" />
                    </div>
                </div>
                }
                <button type="submit">Submit</button>
            </form>
        </div> 
    </div>
</div>
 

таким образом, когда пользователь решает тест и нажимает кнопку отправить, он переходит к моему тестовому пост-действию.

  [HttpPost]
        public IActionResult test(List<Question> list) {
            return Json("");
        }
 

когда я отлаживаю действие post, это и есть результат. Вы можете видеть, какой вариант был выбран.
размещенный элемент списка

Комментарии:

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

2. После того, как пользователь отправит форму вопроса, у вас есть все вопросы с выбранными ответами. Вы можете проверить там, правильный вопрос или нет, и поставить оценку. Просто нужны правильные ответы из вашей базы данных или где вы храните ответы. Возьмите их и сравните.