我的要求是创建一个考试问卷向导。将动态创建向导中的步骤。对于某些申请人(如语言设置等),将会有一些基本步骤。这些问题将根据申请人选择的考试类型生成。每个调查问卷至少会有25到35个问题,这意味着每个向导将有35-45个步骤。我无法将答案保存在数据库中。它必须在会话中,我不能使用java脚本。
用户应该可以轻松访问。他可以按照自己的意愿开始接听考试。
我的方法是为基本步骤(如语言,指令和问题)创建用户控件,并在单击链接时在页面上调用它。我刚刚从我的测试项目中提取了一个示例图像。
由于问题是根据申请人动态提取的,我将获取所有问题并创建一个列表并使用问题用户控制逐步显示它。
我已经在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,所以我将不得不用按钮替换链接。但我将如何处理对象帖子。
答案 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。使用我描述的方法,您仍然会发布整个页面,但如果您处理问题/语言的帖子有不同的操作,则处理每个页面都会更容易。