Передача данных между различными методами действия контроллера
я использую ASP.NET MVC 4
. Я пытаюсь передать данные от одного контроллера к другому контроллеру. Я что-то не так понял. Я не уверен, что это возможно?
вот мой метод действия источника, где я хочу передать данные из:
public class ServerController : Controller
{
[HttpPost]
public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
{
XDocument updatedResultsDocument = myService.UpdateApplicationPools();
// Redirect to ApplicationPool controller and pass
// updatedResultsDocument to be used in UpdateConfirmation action method
}
}
мне нужно передать его в этот метод действия в этом контроллере:
public class ApplicationPoolController : Controller
{
public ActionResult UpdateConfirmation(XDocument xDocument)
{
// Will add implementation code
return View();
}
}
Я пробовал следующее в ApplicationPoolsUpdate
метод действия, но он не работает:
return RedirectToAction("UpdateConfirmation", "ApplicationPool", new { xDocument = updatedResultsDocument });
return RedirectToAction("UpdateConfirmation", new { controller = "ApplicationPool", xDocument = updatedResultsDocument });
как бы я достичь это?
5 ответов:
HTTP и перенаправляет
давайте сначала напомним, как ASP.NET MVC работает:
- когда приходит HTTP-запрос, он сопоставляется с набором маршрутов. Если маршрут соответствует запросу, будет вызвано действие контроллера, соответствующее маршруту.
- перед вызовом метода действия, ASP.NET MVC выполняет привязку модели. Привязка модели - это процесс сопоставления содержимого HTTP-запроса, который в основном является просто текстом, к строго типизированным аргументам вашего метода действия
давайте также напомним себе, что такое редирект:
перенаправление HTTP-это ответ, который веб-сервер может отправить клиенту, сообщая клиенту искать запрошенное содержимое под другим URL-адресом. Новый URL-адрес содержится в
Location
заголовок, который сервер возвращает клиенту. In ASP.NET MVC, вы делаете перенаправление HTTP, возвращаяRedirectResult
действия.передача данных
если вы просто передаете простые значения, такие как строки и/или целые числа, вы можете передать их в качестве параметров запроса в URL-адресе в
Location
заголовок. Вот что произойдет, если вы использовали что-то вродеreturn RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });
как другие предложили
причина, по которой это не сработает, заключается в том, что
XDocument
потенциально очень сложный объект. Там нет простого способа для ASP.NET MVC framework to сериализуйте документ во что-то, что поместится в URL, а затем привязка модели от значения URL обратно к вашемуXDocument
параметр action.В общем, передача документа клиенту для того, чтобы клиент передал его обратно на сервер по следующему запросу, является очень хрупкой процедурой: она потребует всевозможной сериализации и десериализации, и все виды вещей могут пойти не так. Если документ большой, это также может быть существенной тратой пропускной способности и это может серьезно повлиять на производительность приложения.
вместо этого вы хотите сохранить документ на сервере и передать идентификатор обратно клиенту. Затем клиент передает идентификатор вместе со следующим запросом, и сервер получает документ, используя этот идентификатор.
хранение данных для извлечения по следующему запросу
Итак, теперь возникает вопрос, где сервер хранит документ а пока что? Ну, это вам решать, и лучший выбор будет зависеть от конкретного сценария. Если этот документ должен быть доступен в долгосрочной перспективе, вы можете сохранить его на диске или в базе данных. Если он содержит только временную информацию, сохраняя ее в памяти веб-сервера, в 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); }
вы пробовали использовать ASP.NET MVC TempData ?
ASP.NET словарь MVC TempData используется для обмена данными между действиями контроллера. Значение TempData сохраняется до тех пор, пока оно не будет прочитано или пока не истечет время ожидания сеанса текущего пользователя. Сохранение данных в TempData полезно в таких сценариях, как перенаправление, когда значения необходимы за пределами одного запроса.
код будет выглядеть примерно так:
[HttpPost] public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel) { XDocument updatedResultsDocument = myService.UpdateApplicationPools(); TempData["doc"] = updatedResultsDocument; return RedirectToAction("UpdateConfirmation"); }
и в ApplicationPoolController:
public ActionResult UpdateConfirmation() { if (TempData["doc"] != null) { XDocument updatedResultsDocument = (XDocument) TempData["doc"]; ... return View(); } }
Лично Мне не нравится использовать TempData, но я предпочитаю передавать строго типизированный объект, как описано в передача информации между контроллерами в ASP. Net-MVC.
вы всегда должны найти способ сделать его явным и ожидаемым.
Я предпочитаю использовать это вместо
TempData
public class Home1Controller : Controller { [HttpPost] public ActionResult CheckBox(string date) { return RedirectToAction("ActionName", "Home2", new { Date =date }); } }
и еще один
controller Action
- этоpublic class Home2Controller : Controller { [HttpPost] Public ActionResult ActionName(string Date) { // do whatever with Date return View(); } }
это слишком поздно, но я надеюсь быть полезным для любого в будущем
Если вам нужно передать данные от одного контроллера к другому, вы должны передать данные по значениям маршрута.Потому что оба запроса разные.если вы отправляете данные с одной страницы на другую, вам нужно использовать строку запроса пользователя(такую же, как значения маршрута).
но вы можете сделать один трюк:
в вызывающем действии вызовите вызываемое действие как простой метод:
public class ServerController : Controller { [HttpPost] public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel) { XDocument updatedResultsDocument = myService.UpdateApplicationPools(); ApplicationPoolController pool=new ApplicationPoolController(); //make an object of ApplicationPoolController class. return pool.UpdateConfirmation(updatedResultsDocument); // call the ActionMethod you want as a simple method and pass the model as an argument. // Redirect to ApplicationPool controller and pass // updatedResultsDocument to be used in UpdateConfirmation action method } }