Не работает пагинация в asp net mvc
Помогите, пожалуйста! Срочно нужно понять, в чем ошибка вывода в пагинации!!
У меня проект: генерация тестов. Нужно, чтобы один вопрос выводился на одну страницу. Вопрос выводится и стрелки тоже, но почему-то на следующей странице вопрос остается тем же, что и на предыдущей странице и стрелка на предыдущую страницу не появляется. Будто не идет цикл и данные остаются теми же. В чем проблема?
PageViewModel
public int PageNumber { get; private set; }
public int TotalPages { get; private set; }
public PageViewModel(int count, int pageNumber, int pageSize)
{
PageNumber = pageNumber;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
}
public bool HasPreviousPage
{
get
{
return (PageNumber > 1);
}
}
public bool HasNextPage
{
get
{
return (PageNumber < TotalPages);
}
}
QuestAnswersViewModel - основной ViewModel
public QuestAnswersViewModel()
{
QuestValues = new Dictionary<long, string>();
AnswerValues = new Dictionary<long, string>();
}
public Dictionary<long, string> QuestValues { get; set; }
public Dictionary<long, string> AnswerValues { get; set; }
public PageViewModel PageViewModel { get; set; }
QuestionsController
private readonly SaitDbContext db;
private long UserId { get; set; }
public QuestionsController(SaitDbContext context)
{
db = context;
}
/// <summary>
/// Вывод вопросов
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<IActionResult> Index()
{
QuestAnswersViewModel questAnswers = new QuestAnswersViewModel();
if (questAnswers.QuestValues.Count == 0)
{
UserId = db.Users.FirstOrDefault(x => x.Id == int.Parse(User.Identity.GetUserId())).EmployeeId;
GetQuestionsAnswers(questAnswers);
}
return View(questAnswers);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Index(QuestAnswersViewModel questAnswersViewModel)
{
if (ModelState.IsValid)
{
try
{
UserId = db.Users.FirstOrDefault(x => x.Id == int.Parse(User.Identity.GetUserId())).EmployeeId;
foreach (var studentAnswerValue in questAnswersViewModel.AnswerValues)
{
var quest = await db.Questions.FindAsync(studentAnswerValue.Key);
var studentAnswer = new StudentAnswer()
{
QuestionId = quest.Id,
QuestionsTopicId = quest.QuestionTopcId,
RangId = quest.RangsId,
StudentId = UserId,
Answer = studentAnswerValue.Value
};
Answers answer = db.Answers.FirstOrDefault(x => x.QuestionId == quest.Id);
if (answer.ValueAnswer == studentAnswer.Answer)
studentAnswer.IsCheck = true;
else
studentAnswer.IsCheck = false;
db.StudentAnswers.Add(studentAnswer);
}
await db.SaveChangesAsync();
}
catch(DbUpdateException ex)
{
Console.WriteLine(ex.Message);
}
}
return RedirectToAction("Index");
}
private void GetQuestionsAnswers(QuestAnswersViewModel model,int page=1)
{
int pageSize = 1;
var studentAnswersDb = db.StudentAnswers
.Where(x => x.StudentId == UserId).ToList();
List<Questions> questions = new List<Questions>();
if(studentAnswersDb.Count > 0)
{
var studentAnswers = studentAnswersDb
.GroupBy(x => x.QuestionsTopicId)
.OrderBy(x => x.Key)
.ToList();
foreach (var answer in studentAnswers)
{
if(answer.LastOrDefault().IsCheck == true)
{
if(db.Questions.Any(x => x.RangsId > answer.LastOrDefault().RangId && x.QuestionTopcId == answer.Key))
{
questions.Add(db.Questions.Where(x => x.RangsId > answer.LastOrDefault().RangId && x.QuestionTopcId == answer.Key).FirstOrDefault());
}
else
{
if (db.Questions.Any(x => x.Id > answer.LastOrDefault().QuestionId && x.RangsId == answer.LastOrDefault().RangId && x.QuestionTopcId == answer.Key))
{
questions.Add(db.Questions.Where(x => x.Id > answer.LastOrDefault().QuestionId && x.RangsId == answer.LastOrDefault().RangId && x.QuestionTopcId == answer.Key).FirstOrDefault());
}
else
{
questions.Add(db.Questions.Where(x => x.RangsId == answer.LastOrDefault().RangId && x.QuestionTopcId == answer.Key).FirstOrDefault());
}
}
}
else
{
if(db.Questions.Any(x => x.Id > answer.LastOrDefault().QuestionId && x.RangsId == answer.LastOrDefault().RangId && x.QuestionTopcId == answer.Key))
{
questions.Add(db.Questions.Where(x => x.Id > answer.LastOrDefault().QuestionId && x.RangsId == answer.LastOrDefault().RangId && x.QuestionTopcId == answer.Key).FirstOrDefault());
}
else
{
questions.Add(db.Questions.Where(x => x.RangsId == answer.LastOrDefault().RangId && x.QuestionTopcId == answer.Key).FirstOrDefault());
}
}
}
}
else
{
db.Questions
.Where(x => x.RangsId == 1 && x.NumberQuest == 1).ToList()
.ForEach(y => questions.Add(y));
}
//пагинация
var count = questions.Count();
var items = questions.Skip((page - 1) * pageSize).Take(pageSize).ToList();
foreach (var quest in items)
{
model.PageViewModel = new PageViewModel(count, page, pageSize);
model.QuestValues.Add(quest.Id, quest.ValueQuest);
model.AnswerValues.Add(quest.Id, "");
}
}
private bool QuestionsExists(long id)
{
return db.Questions.Any(e => e.Id == id);
}
Index.cshtml
@{
ViewData["Title"] = "Вопросы";
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width"/>
<title>Вариант 1</title>
</head>
<style>
@@font-face {
font-family: 'FontAwesome';
src: url('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2') format('woff2'),
url('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/fonts/fontawesome-webfont.woff') format('woff'),
url('https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/fonts/fontawesome-webfont.ttf') format('truetype');
font-weight: normal;
font-style: normal
}
.glyphicon {
display: inline-block;
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale
}
.glyphicon-chevron-right:before {
content: "\f054";
}
.glyphicon-chevron-left:before {
content: "\f053";
}
</style>
<body>
@using(Html.BeginForm())
{
@foreach(var kvpair in Model.QuestValues)
{
<div class="col-md-10">
@Html.DisplayFor(m=>m.QuestValues[kvpair.Key])
@Html.EditorFor(m=>m.AnswerValues[kvpair.Key])
</div>
}
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
}
@if (Model.PageViewModel.HasPreviousPage)
{
<a asp-action="Index"
asp-route-page="@(Model.PageViewModel.PageNumber - 1)"
class="btn btn-outline-dark">
<i class="glyphicon glyphicon-chevron-left"></i>
Назад
</a>
}
@if (Model.PageViewModel.HasNextPage)
{
<a asp-action="Index"
asp-route-page="@(Model.PageViewModel.PageNumber + 1)"
class="btn btn-outline-dark">
Вперед
<i class="glyphicon glyphicon-chevron-right"></i>
</a>
}
</body>
</html>```