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

时间:2013-04-24 06:00:21

标签: c# forms asp.net-mvc-4

我认为我的问题是一个常见的情况,因为我一直在阅读这些时间,但说实话,我仍然有一些疑问。我有一个简单的控制器与这些动作(据我所知,这遵循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);
}

索引视图将此内容保存在其中

<div id="addDocument">
    @{ Html.RenderAction("AddDocument"); }
</div>

加上一份文件清单。

问题是服务器验证失败时,因为它只显示post方法中所述的部分视图。我希望能够显示索引视图,但不会丢失表单状态(包括modelstate,我想我可以在TempData中传递它,但无论如何我会丢失字段的值)。

据我所知,我可以做一些事情。

  1. 将所有内容放在同一视图中
  2. 与我正在做的相反,并创建文档列表作为局部视图。
  3. 将表单创建为ajax表单。对此不太确定。
  4. 我有什么遗漏吗?

    我一直在考虑保持这个页面不那么“聪明”,因此暂时避免使用ajax,如果明确是最好的解决方案,我肯定会这样做。我认为,我仍然可以在局部视图中维护表单并将其重用于另一个视图。我的意思是两个部分,视图和更新它的列表,这是对的吗?

    由于

1 个答案:

答案 0 :(得分:0)

如果不使用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")

希望这有帮助。