HTTP та переспрямування
Давайте спочатку розповімо, як працює ASP.NET MVC:
- Коли надходить запит HTTP, він відповідає набору маршрутів. Якщо маршрут відповідає запиту, буде викликано дію контролера, що відповідає маршруту.
- Перш ніж викликати метод дії, ASP.NET MVC виконує прив'язку моделі. Прив'язка моделі - це процес відображення вмісту HTTP-запиту, який в основному є лише текстом, до сильно набраних аргументів вашого методу дії.
Давайте також нагадаємо собі, що таке переспрямування:
Перенаправлення HTTP - це відповідь, яку веб-сервер може надіслати клієнтові, вказуючи клієнту шукати необхідний вміст за іншою URL-адресою. Нова URL-адреса міститься в Locationзаголовку, який веб-сервер повертає клієнту. В ASP.NET MVC ви виконуєте перенаправлення HTTP, повертаючи a RedirectResultз дії.
Передача даних
Якщо ви просто передавали такі прості значення, як рядки та / або цілі числа, ви можете передати їх як параметри запиту в URL-адресі в Locationзаголовку. Ось що могло б статися, якби ви використовували щось подібне
return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });
як припускали інші
Причина того, що це не спрацює, полягає в XDocumentтому, що це потенційно дуже складний об'єкт. Немає простого способу для ASP.NET MVC серіалізувати документ у щось, що вміщуватиметься у URL-адресу, а потім моделювати прив’язку зі значення URL-адреси до вашого XDocumentпараметра дії.
Загалом, передача документа клієнту для того, щоб клієнт передав його назад серверу при наступному запиті, є дуже крихкою процедурою: для цього потрібні всілякі серіалізації та десериалізації, і всілякі речі можуть піти не так. Якщо документ великий, це також може бути значною втратою пропускної здатності та може суттєво вплинути на ефективність вашої програми.
Замість цього потрібно зберегти документ на сервері та передати ідентифікатор клієнту. Потім клієнт передає ідентифікатор разом із наступним запитом, а сервер отримує документ, використовуючи цей ідентифікатор.
Зберігання даних для отримання за наступним запитом
Отже, постає питання, де тим часом сервер зберігає документ? Ну, це вирішувати вам, і найкращий вибір буде залежати від вашого конкретного сценарію. Якщо цей документ повинен бути доступним у довгостроковій перспективі, можливо, ви захочете зберегти його на диску або в базі даних. Якщо вона містить лише перехідну інформацію, збереження її в пам'яті веб-сервера, у кеші ASP.NET або Session(або TempData, що більш-менш однаково Sessionз кінцевим) може бути правильним рішенням. У будь-якому випадку ви зберігаєте документ під ключем, який дозволить вам отримати документ пізніше:
int documentId = _myDocumentRepository.Save(updatedResultsDocument);
а потім ви повертаєте цей ключ клієнту:
return RedirectToAction("UpdateConfirmation", "ApplicationPoolController ", new { id = documentId });
Коли ви хочете отримати документ, ви просто отримуєте його на основі ключа:
public ActionResult UpdateConfirmation(int id)
{
XDocument doc = _myDocumentRepository.GetById(id);
ConfirmationModel model = new ConfirmationModel(doc);
return View(model);
}