#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. После того, как пользователь отправит форму вопроса, у вас есть все вопросы с выбранными ответами. Вы можете проверить там, правильный вопрос или нет, и поставить оценку. Просто нужны правильные ответы из вашей базы данных или где вы храните ответы. Возьмите их и сравните.