我认为我的问题是一个常见的情况,因为我一直在阅读这些时间,但说实话,我仍然有一些疑问。我有一个简单的控制器与这些动作(据我所知,这遵循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中传递它,但无论如何我会丢失字段的值)。
据我所知,我可以做一些事情。
我有什么遗漏吗?
我一直在考虑保持这个页面不那么“聪明”,因此暂时避免使用ajax,如果明确是最好的解决方案,我肯定会这样做。我认为,我仍然可以在局部视图中维护表单并将其重用于另一个视图。我的意思是两个部分,视图和更新它的列表,这是对的吗?
由于
答案 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")
希望这有帮助。