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

Я использую 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 });

Как я могу это достичь?

Ответ 1

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

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

  • Когда приходит HTTP-запрос, он сопоставляется с набором маршрутов. Если маршрут соответствует запросу, будет активировано действие контроллера, соответствующее маршруту.
  • Перед вызовом метода действия ASP.NET MVC выполняет привязку модели. Связывание модели - это процесс сопоставления содержимого HTTP-запроса, который в основном представляет собой текст, строго типизированным аргументам вашего метода действий.

Давайте также напомнить себе, что такое перенаправление:

HTTP-перенаправление - это ответ, который веб-сервер может отправить клиенту, сообщая клиенту искать запрашиваемый контент под другим URL-адресом. Новый URL-адрес содержится в заголовке Location, который веб-сервер возвращает клиенту. В ASP.NET MVC вы перенаправляете HTTP, возвращая 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);
 }

Ответ 2

Вы пытались использовать 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();
    }
}

Ответ 4

я предпочитаю использовать это вместо 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();
    }
}

это слишком поздно, но я надеюсь быть полезным для любого в будущем

Ответ 5

Если вам нужно передать данные с одного контроллера на другой, вы должны передавать данные по значениям маршрута. Потому что оба являются разными запросами. Если вы отправляете данные с одной страницы на другую, вы должны иметь строку запроса пользователя (такую ​​же, как значения маршрута).

Но вы можете сделать один трюк:

В вашем вызове вызывается вызываемое действие как простой метод:

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