我有一个接收模型并将其保存到数据库的HTTPPOST操作方法:
[HttpPost]
public ActionResult AddDocument(Document doc){
DocumentRepository repo= GetDocumentRepository();
repo.SaveDocument(doc);
return View(viewName: "DocViewer", model: doc);
}
所以这个方法接收模型,保存它,然后将它返回给DocViewer
视图以显示添加的文档。我有两个问题,包括问题中的一个
- 如果我在
DocViewer
出现后按F5,我会得到一个警告,post方法将再次被调用。我该如何避免这种情况?我相信有一个通用的做法 在
DocViewer
视图中,我已经定义了这样的HTML元素:<div>Full name</div> <div>@Html.LabelFor(x=>x.FullName)</div> <div>Address</div> <div>@Html.LabelFor(x=>x.Address)</div> //and so on
但是我得到的是以下输出:
Full name FullName
Address Address
我不应该得到实际值,但不是属性名称(或显示名称,如果它提供)?
在Post操作中不将模型对象返回到视图:
[HttpPost]
public ActionResult AddDocument(Document doc)
{
DocumentRepository repo= GetDocumentRepository();
repo.SaveDocument(doc);
//return View("DocViewer");
TempData["Document"] = doc;
return RedirectToAction("DocViewer","ControllerName");
}
和DocViewer action:
public ActionResult DocViewer()
{
Document doc = TempData["DocViewer"] as Document;
return View(doc);
}
更新:
你必须通过它的动作重定向到DocViewer视图,以避免再次表单post,如果F5按下。
查看详细信息
Ehsan的答案确实解决了第一个问题。我不应该返回一个模型对象给视图,而应该重定向到另一个动作方法。第二个问题是由于LabelFor
辅助方法的性质引起的。LabelFor
只是创建标签,这意味着标签值。为了显示实际值而不使用文本框,有另一个方法称为DisplayTextFor
。使用该方法后,我可以得到实际的值