Передача данных между различными методами действия контроллера


я использую 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 65

5 ответов:

HTTP и перенаправляет

давайте сначала напомним, как ASP.NET MVC работает:

  1. когда приходит HTTP-запрос, он сопоставляется с набором маршрутов. Если маршрут соответствует запросу, будет вызвано действие контроллера, соответствующее маршруту.
  2. перед вызовом метода действия, 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
 }
}