Asp.net mvc 4 在RedirectToAction方法内传递模型时,上载的文件将丢失

Asp.net mvc 4 在RedirectToAction方法内传递模型时,上载的文件将丢失,asp.net-mvc-4,redirect,file-upload,Asp.net Mvc 4,Redirect,File Upload,这是我保存用户输入,然后重定向到查看模式的操作方法: [HttpPost] public ActionResult SaveDocumentCitizen(DocumentCitizen documentCitizen) { DocumentCitizenRepository repository = new DocumentCitizenRepository(); repository.SaveDocument(documentCitizen); return Redi

这是我保存用户输入,然后重定向到查看模式的操作方法:

[HttpPost]
public ActionResult SaveDocumentCitizen(DocumentCitizen documentCitizen)
{
    DocumentCitizenRepository repository = new DocumentCitizenRepository();
    repository.SaveDocument(documentCitizen);
    return RedirectToAction(actionName: "ViewDocumentCitizen", routeValues: new RouteValueDictionary(documentCitizen));
}
下面是ViewDocumentCitizen操作方法:

public ActionResult ViewDocumentCitizen(DocumentCitizen doc)// The Attachment value is null here
{
    DocumentCitizenRepository repository = new DocumentCitizenRepository();
    DocumentCitizen docCitizen = repository.UpdateTextualValues(doc.DocID);
    return View(viewName: "DocumentCitizen", model: docCitizen);
}
DocumentCitizen模型具有以下属性:

public byte[] Attachment{get;set;}

我选择一个文件,然后提交表单,然后在调试
SaveDocumentCitizen
方法时,我可以看到附件不是空的。但一旦传递给
ViewDocumentCitizen
方法,它就会被设置为null。要通过重定向保持文件属性值,我必须做些什么?

我认为问题在于RouteData中的参数名和Action方法中的参数名不相等。尝试修改您的
SaveDocumentCitizen
操作

[HttpPost]
public ActionResult SaveDocumentCitizen(DocumentCitizen documentCitizen)
{
    DocumentCitizenRepository repository = new DocumentCitizenRepository();
    repository.SaveDocument(documentCitizen);
    return RedirectToAction(actionName: "ViewDocumentCitizen", routeValues: new RouteValueDictionary(new RouteValueDictionary(new Dictionary<string, object> {{"doc", documentCitizen}})));
}
这将有助于ModelBinder按名称识别参数

编辑:

从MSDN“Controller.RedirectToAction”

向浏览器返回HTTP 302响应,这会导致浏览器对指定操作发出GET请求

Get方法有长度限制,请阅读详细信息

但是.Net Framework已经准备就绪,他们创建了ControllerBase.TempData属性,请阅读更多


希望它能帮助您

尝试改用httppostedfilebase…我扩展了ByteArrayModelBinder,将httppostedfilebase转换为byte[]。请查看此链接以了解如何更改。这样,参数本身将变为null。RedirectToAction将发送[GET]请求,可能是您的字节数组太大了?如果是这样的话,那么使用它为此创建的TempData存储
return RedirectToAction(actionName: "ViewDocumentCitizen", routeValues: new { doc = documentCitizen});