对于成功的用例,Post/Redirect/Get(PRG)工作流程非常简单:只需将(客户端)重定向到所需的页面即可.但是在服务器端验证期间遇到错误并且我们想要在再次显示输入页面时保留输入的情况呢?
据我所知,有两种方法:在错误期间简单地重新呈现输入页面(即没有重定向)(因此忽略PRG模式); 或者,重定向到输入页面,并在渲染期间将之前的输入存储在稍后可以检索的某处(例如会话).两者都有缺点:首先,我们会遇到PRG模式帮助我们避免的问题(例如书签,双重提交); 第二种方法导致不一致的GET(第一次GET将找到存储的输入,后续的GET可能不会).还有其他替代方案吗?我希望社区提供有关如何最好地处理此案件的意见.
我正在使用PRG模式来避免多个表单提交.然而,它有一个严重的缺点 - 你不能简单地echo向用户发出确认消息(显然,用户不会看到该页面,他将被重定向到另一个页面).
这个问题的解决方案是什么?我知道其中两个,但它们似乎都不完美.
http://example.com/?msg=data-saved.它是无国籍的,所以我认为它非常可靠.但是当用户复制链接,书签等时会产生问题.或许还有其他方法我不知道?会话和URL参数的某些组合?不知道.
你认为最好的方法是什么?哪一个缺点最少?优缺点都有什么?
error-handling session user-interface redirect post-redirect-get
我试图通过使用[ImportModelStateFromTempData]和[ExportModelStateToTempData]动作过滤器来实现PRG模式.这种模式适用于扁平模型,但是当我有一个子集合时,我无法使它工作.我的模型看起来像这样:
public class QuestionModel
{
public string QuestionText { get; set; }
public ICollection<ChoiceModel> Choices { get; set; }
}
public class ChoiceModel
{
public string ChoiceText { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的控制器如下:
[HttpGet, ImportModelStateFromTempData]
public ActionResult Create()
{
return View();
}
[HttpPost, ExportModelStateToTempData]
public ActionResult Create(QuestionModel model)
{
if(ModelState.IsValid)
{
// not getting here
}
return RedirectToAction("Create");
}
Run Code Online (Sandbox Code Playgroud)
我的视图允许用户向选项添加新项目,并且我验证选择必须是唯一的.当我的ModelState无效时,它会将ModelState打包成TempData并重定向到HttpGet操作.
此时,我的所有子模型值都在ModelState中,但在将模型传递给视图时它不会重建它们,因此我的视图显示添加了0个子项.
有没有办法以某种方式将ModelState与模型合并,或者我可以不将此模式与子对象一起使用?