我使用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 });
我将如何实现这一目标?
HTTP和重定向
让我们回顾一下第一个ASP.NET MVC是如何工作的:
- 当HTTP请求时,它与一组路由的匹配。 如果路由请求相匹配时,对应于该路由的控制器动作将被调用。
- 调用操作方法之前,ASP.NET MVC执行模型绑定。 模型绑定是映射的HTTP请求,这基本上只是文本的内容,你的操作方法的强类型参数的过程
让我们也提醒自己重定向是什么:
HTTP重定向是Web服务器可以发送到客户端,告诉客户端查找下一个不同的URL请求的内容的响应。 新的URL包含在一个Location
是网络服务器返回给客户端头。 在ASP.NET MVC,您可以通过返回做一个HTTP重定向RedirectResult
从动作。
数据传递
如果你只是路过像字符串和/或整数简单的值,你可以将它们作为在URL查询参数Location
头。 这是如果你使用像会发生什么
return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });
如其他人所说
这将无法正常工作的原因是, XDocument
是一个潜在的非常复杂的对象。 没有为ASP.NET MVC框架没有直接的方式将文档序列化到的东西,将一个URL,然后绑定模型拟合从URL值回你XDocument
动作参数。
在一般情况下,通过原稿给客户,以便客户将其传递到服务器上的下一个请求,是一个非常脆弱的程序:它需要系列化和deserialisation的所有种类和各种事情可能出错。 如果文件很大,这也可能是带宽的大量浪费,而且可能严重影响应用程序的性能。
相反,你想要做的就是保持周围的文件在服务器上,并通过标识符返回给客户端。 然后,客户端通过所述标识符与下一个请求一起和服务器检索使用该标识符的文件。
上的下一个请求存储用于检索数据
所以,现在的问题是,在哪里呢服务器存储在此期间的文件? 嗯,这是由你来决定,最好的选择将取决于您的特定情况。 如果该文件必须从长远来看用,您可能希望将其存储在磁盘上或在数据库中。 如果它仅包含瞬时信息,保持它在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);
}
你已经尝试使用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();
}
}
这是为时已晚,但我希望能在未来的任何一个乐于助人
如果你需要从一个控制器的数据传递到另一个你必须航线values.Because传递数据的请求。如果你从一个页面发送到另一个数据,那么你必须对用户的查询字符串(同路由值)这两个是不同的。
但是你可以做一个绝招:
在您的通话动作呼叫被叫行动的简单方法:
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
}
}