在服务器验证错误后,从部分视图持久化表单状态
本文关键字:视图 持久化 表单 状态 验证 服务器 错误 | 更新日期: 2023-09-27 18:10:42
我认为我的问题是一个常见的场景,因为我已经阅读了这些小时,但说实话,我仍然有一些疑问。我有一个具有这些动作的简单控制器(据我所知,这遵循PRG模式)
public ActionResult Index()
{
var partyId = (int) Session["PartyId"];
var viewModel = _displayBuilder.Build(partyId);
return View(viewModel);
}
[HttpGet]
public ActionResult AddDocument()
{
var partyId = (int) Session["PartyId"];
var viewModel = _createBuilder.Build(partyId);
return PartialView("_AddDocument", viewModel);
}
[HttpPost]
public ActionResult AddDocument(AddDocumentViewModel viewModel)
{
var partyId = (int)Session["PartyId"];
if (ModelState.IsValid)
{
_documentsManager.AddDocument(viewModel, partyId);
return RedirectToAction("Index");
}
var newViewModel = _createBuilder.Rebuild(viewModel, partyId);
return PartialView("_AddDocument", newViewModel);
}
Index视图中包含了这个
<div id="addDocument">
@{ Html.RenderAction("AddDocument"); }
</div>
加上一个文档列表。
问题是当服务器验证失败时,因为它只显示了post方法中声明的部分视图。我希望能够显示索引视图,但不会失去表单状态(包括modelstate,我想我可以在TempData中传递这个,但无论如何,我会失去字段的值张贴)。
就我所能想到的,还有一些事情我能做。
- 将所有内容放到同一个视图
- 与我正在做的相反,创建文档列表作为部分视图。
- 创建ajax表单。这个我不太确定。
我错过什么了吗?
我想保持这个页面不那么"聪明",我可以,从而避免ajax的时刻,我肯定会去,如果它是明确的是最好的解决方案,虽然。我认为我仍然可以在部分视图中维护表单,并在其他视图中重用它。我是说两个偏导数,视图和更新它的列表,对吗?
谢谢
如果不使用Ajax,我真的看不到任何解决办法,因为您正在将结果呈现为"新"页面。
我真正能想到的唯一方法是重新加载完整的"索引"以及部分视图,但在这种情况下,使用ajax要容易得多。
像这样:
$.ajax({
type: "POST",
url: url,
contentType: "application/json; charset=utf-8",
data: data,
dataType: "html",
success: function (data) {
$("#addDocument").html(data);
}
});
而不是使用
@{ Html.RenderAction("AddDocument"); }
使用@Html.Partial("_AddDocument")