我有这个控制器:
public ActionResult Index(HttpPostedFileBase file)
{
if (file != null && file.ContentLength > 0)
try
{
string path = Path.Combine(Server.MapPath("~/Files"),
Path.GetFileName(file.FileName));
file.SaveAs(path);
ViewBag.Message = "Success";
}
catch (Exception ex)
{
ViewBag.Message = "Error:" + ex.Message.ToString();
}
return RedirectToAction("NewController", new { myFile : file });
}
我的新控制器:
public ActionResult NewController(HttpPostedFile myFile)
{
}
我想将“文件”传递给NewController
,但它在RedirectToAction
给出了错误。如何将正确的值传递给RedirectToAction
以便它可以正常工作?感谢。
答案 0 :(得分:2)
文件可能是非常复杂的对象,您无法在简单RedirectToAction
中传递可能复杂的对象。因此,您必须在File
中存储Session
才能在下一次重定向中将其存储,但由于性能方面的原因,将数据存储在Session
中并不好,您必须设置Session
null从中检索数据后。
但是你可以使用TempData
代替它在后续请求中保持活动状态,并在从中检索数据后立即销毁。
所以只需在TempData中添加您的文件,然后在新的控制器操作中检索它。
我注意到你在Message
中存储ViewBag
的另一件事。但是ViewBag
在重定向期间变为空,因此您无法在ViewBag.Message
操作中获得NewControllerAction
。要在NewControllerAction
中访问它,您必须将其存储在TempData
中,但Message
将具有简单string
,因此您可以将其作为参数传递给{{1}行动。
NewControllerAction
在您的新控制器中:
public ActionResult Index(HttpPostedFileBase file)
{
string Message = string.Empty;
if (file != null && file.ContentLength > 0)
try
{
string path = Path.Combine(Server.MapPath("~/Files"), Path.GetFileName(file.FileName));
file.SaveAs(path);
Message = "Success";
}
catch (Exception ex)
{
Message = "Error:" + ex.Message.ToString();
}
//Adding File in TempData.
TempData["FileData"] = file;
return RedirectToAction("NewControllerAction", "NewController", new { strMessage = Message });
}