Cha*_*ion 6 validation asp.net-mvc multi-step asp.net-mvc-3
我正在开发一个Web应用程序,该应用程序涉及用户填写跨越多个页面的多步骤表单.表单顶部有标签导航(这些链接不提交当前页面)和底部的下一个按钮(确实提交).我正在考虑处理表单提交/验证的几种策略:
每个表单页面一个操作方法和视图.当您点击下一步时,它会将表单提交给下一页的操作方法.如果存在验证错误,您将被重定向回上一页:
每个表单页面一个操作方法和视图.当您点击下一步时,它会将表单提交给当前页面操作.如果存在验证错误,则返回相同的视图.否则,我们会重定向到下一页操作:
所有页面的一种操作方法.URL包含有关正在提交的步骤的其他上下文(例如MyController/MyAction/{step}).控制器消息根据验证和当前步骤选择要返回的视图页面.
我没有在这里列出的另一种方法
我试图列举我所看到的每种方法的一些优点和缺点,但我很想知道:
我强烈推荐选项 2,稍加修改即可。您可能还想考虑为每个操作/视图创建一个视图模型。如果您有一个跨越所有页面的模型,则验证将在所有属性上进行,这意味着即使用户只能在每个屏幕上编辑模型的一部分,他们也可能会收到他们看不到的属性的验证警告。我们最近在一个项目中做到了这一点,并且效果非常好。您必须在后端进行一些数据操作才能将所有内容重新组合在一起,但最终这是值得的。
正如您所说,您的 URL 将是可深度链接的,这意味着用户可以复制/粘贴,更重要的是,他们可以将页面添加为浏览器中的收藏夹,从而使他们可以轻松返回同一位置。在我看来,这使得选项 3 变得过时。
您还将受益于所有导航逻辑都发生在一个地方这一事实。您必须在客户端(您当前所在的页面)上存储“向导”的状态,以便您的控制器知道提交时要做什么。您需要分析向导的状态并决定用户下一步需要去哪里。如果您选择选项 1,您将不知道您“来自哪里”,并且服务器验证错误将很难向客户端显示。这是 POST - REDIRECT - GET 模式的一个漂亮示例。每个页面都有 2 个操作,一个采用简单 id 的 GET,以及一个采用更复杂模型的 POST。发布服务器,弄清楚下一步该去哪里,重定向到 GET。
最后,考虑您的上一个按钮只是直接链接到上一步,而不是提交表单。否则,用户可能会陷入无效步骤。这种情况再次发生在我们身上,效果非常好。
希望这有帮助。祝你好运!