Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc .NET MVC3中多页表单的最佳实践/设计_Asp.net Mvc_Asp.net Mvc 3_Validation_Multi Step - Fatal编程技术网

Asp.net mvc .NET MVC3中多页表单的最佳实践/设计

Asp.net mvc .NET MVC3中多页表单的最佳实践/设计,asp.net-mvc,asp.net-mvc-3,validation,multi-step,Asp.net Mvc,Asp.net Mvc 3,Validation,Multi Step,我正在开发一个web应用程序,它涉及用户填写一个跨多个页面的多步骤表单。表单顶部有选项卡式导航(这些链接不提交当前页面),底部有下一步按钮(提交)。我正在考虑几种处理表单提交/验证的策略: 每个表单页面一个操作方法和视图。当您点击next时,它将表单提交给下一页的action方法。如果存在验证错误,将重定向回上一页: URL是描述性的,可以复制粘贴 仅在错误情况下重定向 由于重定向没有表单数据,因此我们丢失了提交的上下文,这使得很难显示某些错误消息 如果用户试图访问流程中尚未准备好的步骤,则相

我正在开发一个web应用程序,它涉及用户填写一个跨多个页面的多步骤表单。表单顶部有选项卡式导航(这些链接不提交当前页面),底部有下一步按钮(提交)。我正在考虑几种处理表单提交/验证的策略:

  • 每个表单页面一个操作方法和视图。当您点击next时,它将表单提交给下一页的action方法。如果存在验证错误,将重定向回上一页:

    • URL是描述性的,可以复制粘贴
    • 仅在错误情况下重定向
    • 由于重定向没有表单数据,因此我们丢失了提交的上下文,这使得很难显示某些错误消息
    • 如果用户试图访问流程中尚未准备好的步骤,则相同的验证逻辑可用于重定向用户
  • 每个表单页面一个操作方法和视图。当您点击next时,它将表单提交到当前页面操作。如果存在验证错误,则返回相同的视图。否则,我们将重定向到下一页操作:

    • URL是描述性的,可以复制粘贴
    • 重定向非常常见(不确定这是否糟糕)
    • 显示验证错误时,我们与表单提交处于同一请求中,因此我们可以完全访问无效输入
    • 如果我们希望能够添加一个“Previous”按钮(该按钮也提交),则必须传递额外的上下文
  • 所有页面都有一个操作方法。URL包含有关正在提交的步骤的附加上下文(例如,
    MyController/MyAction/{step}
    )。控制器消息根据验证和当前步骤选择要返回的视图页面

    • URL不是描述性的(例如,如果我提交步骤1转到步骤2,那么无论返回第1页(无效)还是第2页,用户看到的URL都是相同的
    • 没有重定向
    • 显示验证错误时,我们与表单提交处于同一请求中,因此我们可以完全访问无效输入
  • 这里没有列出一种不同的方法

  • 我试图列举每种方法的优缺点,但我想知道:

    • 这些方法的其他优点和缺点是什么?我的正确吗?我列出的一些缺点是否可以设计出来
    • 我是否应该使用标准方法来解决这个问题?如果是,为什么是标准方法

    我强烈建议对选项2稍作修改。您可能还需要考虑为每个操作/视图创建一个视图模型。如果您有一个模型跨越所有页面,则验证将在所有属性上进行,这意味着即使用户只能在每个屏幕上编辑模型的一部分,他们也可以获得验证他们看不到的属性的ion警告。我们最近在一个项目中这样做了,效果很好。您必须在后端执行一些数据操作,才能将所有内容重新组合在一起,但最终还是值得的

    正如你所说,你的URL将是可深度链接的,这意味着用户可以复制/粘贴,更重要的是,他们可以在浏览器中将页面添加为收藏夹,使他们能够非常轻松地返回到同一位置。在我看来,这使得选项3过时了

    您还将受益于这样一个事实:您的所有导航逻辑都发生在一个地方。您必须将“向导”的状态存储在客户端(您当前所在的页面)上以便您的控制器知道提交时要做什么。您需要分析向导的状态,并决定用户下一步要去哪里。如果使用选项1,您将不知道“来自”哪里服务器验证错误将很难向客户端显示。这是POST-REDIRECT-GET模式的一个很好的示例。每个页面将有两个操作,一个GET使用简单ID,另一个POST使用更复杂的模型。发布服务器,找出下一步的方向,重定向到GET

    最后,考虑上一个按钮直接链接到前一个步骤,而不是提交表单。否则,用户可能会陷入一个无效的步骤。这发生在我们身上,并且再次工作得很好。


    希望这是有帮助的。祝你好运!

    听起来你需要接受处理请求和返回的操作的概念(在大多数情况下)视图。每个表单页面都有一个操作,允许您拥有一个特定于该页面上数据的视图模型。如果模型无效,该操作可以返回相同的视图,也可以返回下一页的视图。不需要重定向。您可以在
    表单中使用
    隐藏的
    输入,在页面之间传递上下文。@HABO:但是如果我没有重定向,用户在第1页上提交了无效的内容,那么即使返回的视图是第1页的无效视图,他们也不会看到第2页的url吗?您的操作选择了要返回的适当视图:第1页或第2页。它如何决定取决于您。浏览器显示它得到的任何内容,但不需要请求通过重定向创建一个不同的页面。您提到了POST-redirect-GET模式。是否存在频繁重定向使页面转换速度变慢的风险(特别是因为我们在每次请求时都从数据库加载部分模型)当然。这是你必须考虑的事情。在后重定向下,由于Web的无状态特性,工作变得非常好。但是,如果性能是一个问题(缓慢查询等)。您可能想考虑另一个存储解决方案,例如SQL提供程序,或者在会话中存储对象。每个视图使用一个模型,步骤n如何知道步骤1和步骤2完成了CORE。