2012-03-27 45 views
1

我的要求是創建一個考試問卷嚮導。嚮導中的步驟將被動態創建。對於某些申請人而言,將會有一些基本步驟(如語言設置等),這些問題將根據申請人選擇的考試類型而生成。每個調查問卷中至少會有25到35個問題,這意味着每個嚮導將會有35-45個步驟。我無法將答案保存在數據庫中。它必須在會話中,我不能使用Java腳本。MVC3中的問卷嚮導

用戶應該易於訪問。他可以按照他希望的任何順序開始回答考試。

我的方法是爲基本步驟(如語言,指令和問題)創建用戶控件,並在頁面上單擊鏈接時調用它。我剛剛從我的測試項目中提供了一個示例圖像。

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 

問題模型視圖類

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

您可以製作下一個和上一個提交按鈕。如果你給他們一個相同的名字(在下面的代碼中我使用了「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。使用我描述的方法,您仍然可以發佈整個頁面,但是如果您有不同的操作來處理問題/語言帖子,則處理每個帖子會更容易。

+0

我喜歡帶鏈接樣式解決方案的提交按鈕。這很容易做到安全,因爲你不需要啓用javascript。 – goenning 2012-03-27 23:52:20

+0

感謝您的建議,這對我來說意義重大,但是當我考慮上述解決方案時,我想象的是如何在用戶選擇「語言」鏈接按鈕後向用戶提供一個Senario。用戶控件將被加載到屏幕的右側,如上面的示例圖所示。選擇語言用戶後,點擊放置在ASPX頁面上的下一個按鈕。現在綁定到language usercontrol的語言對象被更新。如何觸發用戶控件的發佈操作,因爲它會嘗試提交主嚮導頁面。我更新了有問題的代碼。 – 2012-03-28 14:22:28

+0

可以請給我一個例子或示例代碼。如果我使用提交按鈕作爲菜單,我將如何將參數傳遞給konw哪個菜單被用戶點擊。我無法使用JavaScript,因爲JavaScript將在用戶屏幕上禁用。 – 2012-03-28 21:51:44