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);
}