【问题标题】:Any sample MVC3 Wizard Apps (multi-step) (NO JQUERY)任何示例 MVC3 向导应用程序(多步骤)(无 JQUERY)
【发布时间】:2011-11-08 17:31:44
【问题描述】:

我一直在 GooglePlex 上搜索高/低,并在此处寻找不涉及 MVC3(和 jQuery)的客户端验证元素的示例 MVC3 向导(多步骤)。我在这里至少看到了一些元素的详细解释:multi-step registration process issues in asp.net mvc (splitted viewmodels, single model),但我无法让它正常工作。

作为 MVC3 和一般编程的新手,我怀疑是我的经验水平使我无法让它工作。

无论如何,对非 Jquery MVC3 向导示例的任何指导都会很棒。提前谢谢你。

【问题讨论】:

  • 您能否详细说明“无 jQuery”的要求?是否允许使用任何 JavaScript?是否允许使用任何 JavaScript 库或框架?
  • @David 感谢您的快速回复。我正在使用 OrchardCMS v1.3,而 ClientSideValidation 目前在该上下文中不可用。此外,我正在使用一些动态元素,我的理解是 ClientSideValidation 在这种情况下效果不佳(请参阅xhalent.wordpress.com/2011/01/24/…);不过,鉴于我的第一个限制,那里的解决方法没有帮助。
  • 注:stackoverflow.com/questions/6402628/… 的详尽解决方案评论说,9 个“步骤”来坚持这么多信息并不是正确的做法。出于我的目的,这也可能是一个问题,因为我已将我的表单分成至少 7 个步骤(尽管最后一个是确认)。

标签: asp.net-mvc-3 wizard


【解决方案1】:

如果不允许使用 jQuery/javascript,我会做这样的事情

  1. 为向导创建控制器
  2. 创建一个模型,其中包含向导将设置的所有字段。
  3. 每个向导页面创建一个操作,所有操作应使用相同的模型
  4. 创建将所有内容保存到数据库的最终操作。

【讨论】:

  • 在我看来这行不通,因为您不会在操作中使用所有数据,当您回发到控制器时,您将丢失所有未使用的字段。因此,您要么必须使用会话,要么使用隐藏字段(创建某种视图状态)。这是真的吗?
  • 谢谢,我刚刚添加了一个 div 并在那里添加了所有元素。它就像一个魅力。谢谢...
【解决方案2】:

乔纳斯是绝对正确的。下面是进一步的细分。

public class MyModel
{
     [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public Guid Id { get; set };
     public string StepOneData { get; set; }
     public string StepTwoData { get; set; }
}

上面的 coed 很简单,所以请替换其中的字段。接下来,我们从一个启动向导的简单操作开始。

    public ActionResult WizardStep1()
    {
        return View(new MyModel());
    }

这会调用视图“WizardStep1.cshtml(如果使用的是 razor)。如果需要,您可以使用创建模板向导。我们只是将帖子重定向到不同的操作。

<WizardStep1.cshtml>
@using (Html.BeginForm("WizardStep2", "MyWizard")) {

值得注意的是,我们会将其发布到不同的操作中; WizardStep2 操作

    [HttpPost]
    public ActionResult WizardStep2(MyModel myModel)
    {
        return ModelState.IsValid ? View(myModel) : View("WizardStep1", myModel);
    }

在此操作中,我们检查我们的模型是否有效,如果有效,我们将其发送到 WizardStep2.cshtml 视图,否则我们将其发送回第一步并显示验证错误。在每个步骤中,我们将其发送到下一步,验证该步骤并继续。现在一些精明的开发人员可能会说,如果我们在步骤之间使用 [Required] 属性或其他数据注释,我们就不能在这样的步骤之间移动。你是对的,所以删除尚未检查的项目上的错误。如下所示。

    [HttpPost]
    public ActionResult WizardStep3(MyModel myModel)
    {
        foreach (var error in ModelState["StepTwoData"].Errors)
        {
            ModelState["StepTwoData"].Errors.Remove(error);
        }

最后,我们将模型一次保存到数据存储中。这还可以防止启动向导但未完成向导的用户未将不完整的数据保存到数据库中。

我希望您发现这种实现向导的方法比前面提到的任何方法都更易于使用和维护。

感谢阅读。

【讨论】:

  • 如果向导不是简单的下一个、下一个、下一个,而是有逻辑根据前一个视图的答案决定接下来要显示什么视图,我们将如何处理?谢谢
  • 这需要一个完整的样本。 ;) @SamDelaney,您可以尝试在控制器中执行一些 if/else 逻辑(如果步骤 1 中的单选按钮 1 为是,则执行此操作,否则执行此操作)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2015-04-09
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多