47

我们的网站有多个“向导”,其中各种数据在多个页面上收集,直到最后一步才能提交到数据库。

用 ASP.Net MVC 制作这样的向导的最佳/正确方法是什么

编辑:我的老板现在说“没有 javascript”——关于如何绕过这个限制的任何想法?

4

8 回答 8

46

我不相信有最好/正确的方法,但我这样做的方式是......

每个向导都有自己的页面。每个步骤都有自己的 div。所有步骤都采用相同的形式。

上一个/下一个按钮本质上会在过程的每个步骤中隐藏/显示 div。最后一步的提交按钮提交整个表单。使用 jQuery 实现这一点非常简单,并且由于所有向导步骤都在单个 ViewPage 中,因此维护起来很容易。

在控制器端,您将有两个控制器方法,HttpVerbs.Get 版本将准备表单以供查看,HttpVerbs.Post 版本将采用 FormsResult 并对其进行解析以获取提交用户答案所需的信息存储/其他过程。


哇,你的老板很臭。

这个答案几乎适用于禁用 javascript 的 ****** (是的,两者都是)。您可以调整它以通过 CSS 隐藏下一个上一个按钮,并在您的 javascript 代码中取消隐藏它们。这样,使用 javascript 的人会看到向导,而没有 javascript 的人会看到整个表单(没有下一个/上一个按钮)。

另一个选项是为向导中的每个步骤创建一个视图。您可以将表单的中间结果存储在 Session 中。这种方式会花费大量的时间和精力来实现,这意味着你可能会在你演示时从你的老板那里挤出一些加班时间,在午餐时花费大约 20 分钟的时间,javascript 路由是多么容易实现。

于 2008-11-17T22:29:24.043 回答
20

如果您不能使用 JavaScript,则将每个步骤都设置为视图,并在控制器中使用方法,并将数据保持在会话中,直到准备好提交到数据库。

您可以使用 ActionLink HtmlHelper 方法制作 Next 和 Prev 按钮。

于 2008-11-18T17:05:22.683 回答
12

另一种方法是将使用向导构建的不完整对象保存到数据库中,然后将主键传递给向导的下一步。我知道这意味着您需要将一些数据库字段设为可空,但它确实具有额外的优势,您可以将主键保存在 cookie 中并允许用户稍后返回向导。此选项不需要 javascript 或会话状态。

于 2009-02-03T19:49:41.597 回答
4

使不同的面板都成为客户端......都以相同的形式......当按下最终提交按钮时,您可以同时发布所有值。

于 2008-11-17T22:28:37.243 回答
3

如果您不能使用 Javascript 并且不想将服务器资源用于 Session 变量,您还可以对在不同步骤中输入的值进行序列化和反序列化,并使用隐藏的输入字段来回传递。有点像 ASP.NET Webforms 中的 ViewState。

于 2008-11-24T22:13:40.127 回答
2

我整理了一个登录向导,并在我的博客上记录了它背后的想法,如果有帮助的话:链接文本

于 2009-09-22T20:03:44.190 回答
1

您可以使用 NuGet 上提供的简单组件 MVCWizard.Wizard。WizardController 允许您使用局部视图创建向导。还有一个 AutoWizardController 可以在单个视图中呈现整个向导。所有这些组件都与会话一起操作以存储模型状态。

于 2011-09-12T15:59:57.947 回答
1

在这个问题中有一个非常简单、灵活和可扩展的方法:How to simple my statefull interlaced modal dialogs in ASP.NET MVC

于 2011-12-19T16:36:08.100 回答