MVC3中的问卷调查向导

时间:2012-03-27 22:02:11

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing

我的要求是创建一个考试问卷向导。将动态创建向导中的步骤。对于某些申请人(如语言设置等),将会有一些基本步骤。这些问题将根据申请人选择的考试类型生成。每个调查问卷至少会有25到35个问题,这意味着每个向导将有35-45个步骤。我无法将答案保存在数据库中。它必须在会话中,我不能使用java脚本。

用户应该可以轻松访问。他可以按照自己的意愿开始接听考试。

我的方法是为基本步骤(如语言,指令和问题)创建用户控件,并在单击链接时在页面上调用它。我刚刚从我的测试项目中提取了一个示例图像。

enter image description here

由于问题是根据申请人动态提取的,我将获取所有问题并创建一个列表并使用问题用户控制逐步显示它。

我已经在asp.net中创建了很多向导但没有在MVC中创建,所以我有些疑惑。

面临的问题或疑虑:

导航按钮:NEXT和Previous。我可以将它放在ASPX页面而不是每个用户控制页面。

假设用户选择了一个链接,例如问题1他输入了答案并点击了另一个链接或NEXT按钮我将如何获得用户已选择的答案的更新对象。由于链接没有后期行动。

如果你们可以提出一些实现这一目标的方法,那将会有很大的帮助。

下面显示的是我的aspx页面:

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of MVCApp.WizardVM)" %>
<%@ Import Namespace ="MVCApp" %>
<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<% Using Html.BeginForm("Index", "Home")%>

   <table>
        <tr>
            <td>
                <div id="menu" class="block">                  
                      <ul id="menuItems">              
                        <% For Each item As MVCApp.MenuVM In Model.menus%>       
                         <li><%: Html.ActionLink(item.Description, "Index", "Home", New With {item.ID}, Nothing)%></li>                    
                        <%Next%>
                       </ul>
                </div>
            </td>
            <td>
                <% Html.RenderPartial(Model.UserControlName, Model.Model)%>             


            </td>
        </tr>
        <tr>
        <td colspan=2 align="right">
            <input type="submit" value="Next" />
            <input type="submit" value="Previous" />
        </td>
        </tr>
   </table>

 <% End Using %>        

</asp:Content>

控制器类:

Public Class HomeController
    Inherits System.Web.Mvc.Controller


    Function Index() As ActionResult
        Dim oWizard As New WizardVM
        oWizard = GetData()

        If (ControllerContext.RouteData.Values.Count > 2) Then
            If (ControllerContext.RouteData.Values.Item("ID") = 1) Then
                oWizard.UserControlName = "language"
                oWizard.Model = oWizard.Language

            ElseIf (ControllerContext.RouteData.Values.Item("ID") = 3) Then
                oWizard.UserControlName = "Question"
                oWizard.Model = oWizard.Question
            End If
        Else
            oWizard.UserControlName = "language"
            oWizard.Model = oWizard.Language
        End If

        Return View("index", oWizard)
    End Function

    Function About() As ActionResult
        Return View()
    End Function


    Public Function GetData() As WizardVM
        Try
            Dim oWizard As New WizardVM

            Dim oLanaguage As New LanguageVM
            oLanaguage.Description = "This is a language test screen."
            oWizard.Language = oLanaguage


            Dim oQuestion As New QuestionVM
            oQuestion.Description = "This is a Question test screen."
            oWizard.Question = oQuestion

            Dim oMenus As New List(Of MenuVM)
            Dim oMenuHelper As New MenuHelper
            oMenus = oMenuHelper.BuildMenu()

            oWizard.menus = oMenus

            Return oWizard
        Catch ex As Exception
            Throw ex
        End Try
    End Function


    <HttpPost()>
    Function GetLanguageInfo(ByVal oLanguage As LanguageVM) As ActionResult
        Dim a As Integer
        a = 10
        Return View("index")
    End Function

我的模型视图类

Public Class WizardVM

    Public Property SelectedMenuId As Integer
    Public Property Language As LanguageVM
    Public Property Question As QuestionVM

    Public menus As List(Of MenuVM)

    Public Property UserControlName As String
    Public Property Model As Object

End Class

语言模型视图类

Public Class LanguageVM

    Public Property Description As String

End Class

问题ModelView类

Public Class QuestionVM
    Public Property Description As String
End Class

用户控件:

LANUGAGE

<%@ Control Language="VB" Inherits="System.Web.Mvc.ViewUserControl(of MVCApp.LanguageVM)" %>
<form method="post" action="/Home/GetLanguageInfo"> 
    <p>Description
    <%= Html.TextBoxFor(Function(model) model.Description)%>
    </p>
</form>

我为问题创建的方式相同。我不能使用JavaScript,所以我将不得不用按钮替换链接。但我将如何处理对象帖子。

1 个答案:

答案 0 :(得分:1)

您可以制作下一个和上一个提交按钮。如果你给他们相同的名字(在下面的代码我使用“PageToGo”),那么你可以使用该名称为你的模型添加一个相应的字符串,并在提交时你可以确定下一页去哪个页面。

至于问题链接,如果你需要他们发布答案,我只看到两个解决方案。

1)如果您知道将启用javascript,那么在任何链接点击时,要么使用ajax发布页面,然后在成功时继续链接,或者将链接问题编号保存到表单中,然后发布表单。

如果你做了后一个想法,你会有类似

的东西
if(model.PageToGo == "Next")
   newPage = currentPage + 1;
else if(model.PageToGo == "Previous")
   newPage = currentPage - 1;
else
   newPage = int.Parse(model.PageToGo);

如果您不能假设javascript已启用,我能想到的唯一解决方案是让所有链接都提交按钮,然后使它们看起来像与css的链接。

编辑:查看您的新要求/代码,我的建议是语言和问题不应使用相同的操作。相反,让它们都继承包含所有菜单数据的基本模型,并创建一个共享视图,使用它们创建提交按钮菜单。

听起来您正试图以部分提交Windows窗体的方式部分提交网页。我不知道这是否可能,除非你使用ajax / javascript。使用我描述的方法,您仍然会发布整个页面,但如果您处理问题/语言的帖子有不同的操作,则处理每个页面都会更容易。