我的要求是創建一個考試問卷嚮導。嚮導中的步驟將被動態創建。對於某些申請人而言,將會有一些基本步驟(如語言設置等),這些問題將根據申請人選擇的考試類型而生成。每個調查問卷中至少會有25到35個問題,這意味着每個嚮導將會有35-45個步驟。我無法將答案保存在數據庫中。它必須在會話中,我不能使用Java腳本。MVC3中的問卷嚮導
用戶應該易於訪問。他可以按照他希望的任何順序開始回答考試。
我的方法是爲基本步驟(如語言,指令和問題)創建用戶控件,並在頁面上單擊鏈接時調用它。我剛剛從我的測試項目中提供了一個示例圖像。
由於問題是動態獲取取決於申請人我將獲取所有的問題,並創建一個列表,並使用一步提問用戶控制步驟顯示它。
我在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
問題模型視圖類
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,所以我將不得不用鏈接替換按鈕。但我將如何處理對象後。
我喜歡帶鏈接樣式解決方案的提交按鈕。這很容易做到安全,因爲你不需要啓用javascript。 – goenning 2012-03-27 23:52:20
感謝您的建議,這對我來說意義重大,但是當我考慮上述解決方案時,我想象的是如何在用戶選擇「語言」鏈接按鈕後向用戶提供一個Senario。用戶控件將被加載到屏幕的右側,如上面的示例圖所示。選擇語言用戶後,點擊放置在ASPX頁面上的下一個按鈕。現在綁定到language usercontrol的語言對象被更新。如何觸發用戶控件的發佈操作,因爲它會嘗試提交主嚮導頁面。我更新了有問題的代碼。 – 2012-03-28 14:22:28
可以請給我一個例子或示例代碼。如果我使用提交按鈕作爲菜單,我將如何將參數傳遞給konw哪個菜單被用戶點擊。我無法使用JavaScript,因爲JavaScript將在用戶屏幕上禁用。 – 2012-03-28 21:51:44