一尘不染

在不同的控制器动作方法之间传递数据

c#

我正在使用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 });

我将如何实现?


阅读 156

收藏
2020-05-19

共1个答案

一尘不染

HTTP和重定向

让我们首先回顾一下ASP.NET MVC的工作方式:

  1. 当HTTP请求进入时,它将与一组路由匹配。如果路由与请求匹配,则将调用与该路由相对应的控制器动作。
  2. 在调用操作方法之前,ASP.NET MVC执行模型绑定。模型绑定是将HTTP请求的内容(基本上只是文本)映射到action方法的强类型参数的过程。

让我们还提醒自己什么是重定向:

HTTP重定向是Web服务器可以发送给客户端的响应,告诉客户端在其他URL下查找请求的内容。新的URL包含在LocationWeb服务器返回给客户端的标头中。在ASP.NET
MVC中,您可以通过RedirectResult从操作返回a 来执行HTTP重定向。

传递数据

如果只是传递简单值,例如字符串和/或整数,则可以将它们作为查询参数传递到Location标头中的URL中。如果您使用类似的东西会发生这种情况

return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });

正如其他人所建议的

之所以不起作用,是因为该XDocument对象可能非常复杂。ASP.NET
MVC框架没有直接的方法将文档序列化为适合URL的模型,然后将模型从URL值绑定回您的XDocument操作参数。

通常,将文档传递给客户端以便客户端在下一个请求时将其传递回服务器是一个非常脆弱的过程:它将需要各种序列化和反序列化,并且各种事情都可能出错。如果文档很大,也可能会浪费大量带宽,并可能严重影响应用程序的性能。

相反,您要做的是将文档保留在服务器上,然后将标识符传递回客户端。然后,客户端将标识符与下一个请求一起传递,服务器使用该标识符检索文档。

存储数据以在下一个请求时进行检索

因此,现在的问题变成了,服务器在此期间将文件存储在哪里?好吧,这是由您决定的,最佳选择将取决于您的特定情况。如果长期需要该文档,则可能需要将其存储在磁盘或数据库中。如果它仅包含瞬态信息,则将其保存在Web服务器的内存中,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);
 }
2020-05-19