在RedirectToAction方法中传递模型时,上载的文件会丢失

时间:2014-07-22 07:07:27

标签: asp.net-mvc-4 redirect file-upload

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

[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方法时,我可以看到Attachment不为null。但是一旦传递给ViewDocumentCitizen方法,它就会被设置为null。如何通过重定向保持文件属性值?

1 个答案:

答案 0 :(得分:1)

我认为问题是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}})));
}

或更好

return RedirectToAction(actionName: "ViewDocumentCitizen", routeValues: new { doc = documentCitizen});

这应该有助于您的ModelBinder按名称识别参数

修改

来自MSDN“Controller.RedirectToAction”

  

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

获取方法有一个长度限制,请阅读更多HERE

但.Net Framework已准备好应对所有事情,并且他们创建了ControllerBase.TempData属性,在MSDN

上阅读更多内容

希望它能帮到你