Как заставить работать пагинацию в Webgrids в MVC - PullRequest
0 голосов
/ 13 июня 2019

У меня есть веб-приложение MVC / asp.net, где пользователи (помимо прочего) могут изменять контент в базе данных. Все работает нормально, за исключением того, что, когда я добавляю более 10 элементов в свою сетку, она добавляет вторую страницу, которая выдает ошибку.

Только для пояснения в коде контент, который может быть обновлен, принадлежит Приложению и написан на указанном языке.

MyController: Суммируя, пользователь выбирает приложение и язык, для которых он хочет обновить контент. Затем мы подключаемся к БД и ищем в ней все содержимое, которое соответствует идентификатору приложения и языку LCID. Если он совпадает, «Фабрика» передает его обратно как объект, в противном случае возвращается ноль. Если ноль, это не добавляется. Если какой-либо контент вообще доступен, он создает временный сеанс и передает его контроллеру View (таким образом изменяется URL, а не только представление).

public ActionResult Content(ContentCreator contentCreator)
    {
        consoleEntities db = new consoleEntities();
        List<translation_contents> possibleContents = db.translation_contents.ToList(); //get a list of ALL the translation contents
        List<WebGrid> webGrids = new List<WebGrid>(); //the passable object to populate the table in UpdateContent view


        foreach (translation_contents contentToCheck in possibleContents)
        {
            //the FactoryOfWebGrids will check if the contentToCheck AppName and language match what the user provided.
            //if it matches, it will pass back a webGrid object to add to the list. If it doesnt, it will pass back a Null which is not added.                    
            WebGrid Factory = FactoryOfWebGrids(contentToCheck, contentCreator.SelectedApplication, contentCreator.CurrentLanguage);
            if (Factory != null)
            {
                webGrids.Add(Factory);
            }
        }

        //If there are no webgrids, do not go to the ContentUpdate View
        if (webGrids.Count == 0)
        {
            ContentCreator passBack = CreateContentObject(); //needs a new ContentCreator object to reload the Contents View
            ViewBag.Message = "No Content to Display. Please try again.";
            return View("Content", passBack);
        }
        else
        {
            Session["webGrids"] = webGrids;
            TempData["passableWebGrid"] = webGrids;


            return Redirect("ContentUpdate");
        }

    }

    public ActionResult ContentUpdate()
    {

        List<WebGrid> webGrids = TempData["passableWebGrid"] as List<WebGrid>;
        return View(webGrids);

    }

Мой HTML: Обратите внимание, что это очень сжатая версия, но я добавлю все, что связано с GridView.

@model IEnumerable<Translation_Interface.Models.WebGrid>
@{
    WebGrid grid = new WebGrid(source: Model);
 }

 ....
  <div class="table table-striped table-bordered" id="gridView">
      @grid.GetHtml(
         htmlAttributes: new { @id = "WebGrid", @class = "Grid" },
         columns: grid.Columns(
                  grid.Column(null, "Select", format: 
                  @<text>@Html.ActionLink("Select", null, null, new { @class =  "select" })</text>),
                  grid.Column("ContentTitle", "Title"),
                  grid.Column("ContentMin", "Content"),
                  grid.Column("CreatedBy", "Created By"),
                  grid.Column("LastUpdated", "Last Updated"),
                  grid.Column("Key", "ID")))
     </div>

Вид сетки работает очень хорошо, и содержимое передается в формате JSON (здесь не показан). Но когда я нажимаю, чтобы перейти на вторую страницу, выдается ошибка:

System.InvalidOperationException: 'Источник данных должен быть привязан до выполнения этой операции.'

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

У меня вопрос, как мне сохранить все доступные данные, и когда я нажимаю, чтобы перейти на вторую страницу, он просто использует те же данные / Список, что и раньше?

Примечания: Я иду от localhost: ##### / Content / ContentUpdate => localhost: ##### / Content / ContentUpdate? Page = 2 при нажатии кнопки (или в хотя бы теоретически это должно быть то, что происходит, но ошибка вылетает, прежде чем я туда доберусь).

Примечания: Мой javascript / JQuery ТОЛЬКО передает JSON контроллеру, когда для строки выбрано 'select'. Больше ничего не делает.

Тестовые данные в GridView: Test Data in the GridView

Заранее спасибо!

1 Ответ

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

Никто не ответил, поэтому я просто отключил нумерацию страниц.

@model IEnumerable<Translation_Interface.Models.WebGrid>
@ {
  WebGrid grid = new WebGrid(source: Model, canPage: false);
  }
...