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

Bre*_*ogt 69 c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我正在使用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
     }
}
Run Code Online (Sandbox Code Playgroud)

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

public class ApplicationPoolController : Controller
{
     public ActionResult UpdateConfirmation(XDocument xDocument)
     {
          // Will add implementation code

          return View();
     }
}
Run Code Online (Sandbox Code Playgroud)

我在ApplicationPoolsUpdate动作方法中尝试了以下操作,但它不起作用:

return RedirectToAction("UpdateConfirmation", "ApplicationPool", new { xDocument = updatedResultsDocument });

return RedirectToAction("UpdateConfirmation", new { controller = "ApplicationPool", xDocument = updatedResultsDocument });
Run Code Online (Sandbox Code Playgroud)

我怎么做到这一点?

Run*_*une 68

HTTP和重定向

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

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

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

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

传递数据

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

return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });
Run Code Online (Sandbox Code Playgroud)

正如其他人所说

这不起作用的原因是它XDocument是一个潜在的非常复杂的对象.ASP.NET MVC框架没有直接的方法将文档序列化为适合URL的内容,然后将URL值绑定回XDocument动作参数.

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

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

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

那么,现在的问题是,服务器在何时同时存储文档?那么,这是由你来决定的,最好的选择将取决于你的特定情况.如果从长远来看这个文档需要可用,您可能希望将其存储在磁盘或数据库中.如果它只包含瞬态信息,将它保存在Web服务器的内存中,在ASP.NET缓存中或Session(或者TempData,Session与最终的或多或少相同)可能是正确的解决方案.无论哪种方式,您都可以将文档存储在一个密钥下,以便以后检索文档:

int documentId = _myDocumentRepository.Save(updatedResultsDocument);
Run Code Online (Sandbox Code Playgroud)

然后将该密钥返回给客户端:

return RedirectToAction("UpdateConfirmation", "ApplicationPoolController ", new { id = documentId });
Run Code Online (Sandbox Code Playgroud)

当您想要检索文档时,只需根据键获取它:

 public ActionResult UpdateConfirmation(int id)
 {
      XDocument doc = _myDocumentRepository.GetById(id);

      ConfirmationModel model = new ConfirmationModel(doc);

      return View(model);
 }
Run Code Online (Sandbox Code Playgroud)


use*_*075 61

您是否尝试过使用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");
}
Run Code Online (Sandbox Code Playgroud)

在ApplicationPoolController中:

public ActionResult UpdateConfirmation()
{
    if (TempData["doc"] != null)
    {
        XDocument updatedResultsDocument = (XDocument) TempData["doc"];
            ...
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)


L-F*_*our 11

我个人喜欢使用TempData,但我更喜欢传递强类型对象,如ASP.Net-MVC中控制器之间传递信息中所述.

你总是应该找到一种方法来使它明确和预期.

  • 它不处理 ViewData,因为 ViewData 不可序列化,这是无法在进程中运行的会话(网络农场)的要求......我非常不喜欢 TempData(这是我能说的最好的方式)。 (2认同)

小智 5

我更喜欢使用它而不是 TempData

public class Home1Controller : Controller 
{
    [HttpPost]
    public ActionResult CheckBox(string date)
    {
        return RedirectToAction("ActionName", "Home2", new { Date =date });
    }
}
Run Code Online (Sandbox Code Playgroud)

另一个controller Action

public class Home2Controller : Controller 
{
    [HttpPost]
    Public ActionResult ActionName(string Date)
    {
       // do whatever with Date
       return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

为时已晚,但我希望对未来的任何人有所帮助

  • 但在很多情况下,我们希望在 `RedirectToAction` 中传递一个复杂的模型。 (2认同)