У меня есть веб-приложение 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:
Заранее спасибо!