gpt4 book ai didi

c# - 在不同的 Controller 操作方法之间传递数据

转载 作者:IT王子 更新时间:2023-10-29 03:42:08 25 4
gpt4 key购买 nike

我正在使用 ASP.NET MVC 4。我正在尝试将数据从一个 Controller 传递到另一个 Controller 。我不明白这一点。我不确定这是否可行?

这是我要从中传递数据的源操作方法:

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

我需要将它传递给此 Controller 中的此操作方法:

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

我将如何实现这一点?

最佳答案

HTTP 和重定向

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

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

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

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

传递数据

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

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

正如其他人所建议的那样

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

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

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

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

那么,现在的问题就变成了,服务器同时将文档存放在哪里呢?好吧,这由您决定,最佳选择将取决于您的特定情况。如果此文档需要长期可用,您可能希望将其存储在磁盘或数据库中。如果它只包含临时信息,将其保存在网络服务器的内存中、ASP.NET 缓存中或 Session(或 TempData,这或多或少与Session 最后)可能是正确的解决方案。无论哪种方式,您都将文档存储在一个 key 下,以便您稍后可以检索该文档:

int documentId = _myDocumentRepository.Save(updatedResultsDocument);

然后您将该 key 返回给客户端:

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

关于c# - 在不同的 Controller 操作方法之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com