在服务器验证错误后,从部分视图持久化表单状态

本文关键字:视图 持久化 表单 状态 验证 服务器 错误 | 更新日期: 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中传递这个,但无论如何,我会失去字段的值张贴)。

就我所能想到的,还有一些事情我能做。

  1. 将所有内容放到同一个视图
  2. 与我正在做的相反,创建文档列表作为部分视图。
  3. 创建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")