如何将文件传递给控制器

时间:2017-04-11 07:51:18

标签: c# asp.net asp.net-mvc

我有这个控制器:

   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以便它可以正常工作?感谢。

1 个答案:

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