Анкета Wizard в MVC3 - PullRequest
       20

Анкета Wizard в MVC3

1 голос
/ 28 марта 2012

Мое требование - создать мастер экзаменационной анкеты.Шаги в мастере будут создаваться динамически. Существуют некоторые основные шаги, которые будут общими для некоторых кандидатов, таких как языковые настройки и т. Д. Вопросы будут создаваться в зависимости от типа экзамена, выбранного кандидатом.В каждом вопроснике будет не менее 25–35 вопросов, что означает 35–45 шагов на мастера.Я не могу сохранить ответы в базе данных.Это должно быть в сеансе, и я не могу использовать скрипт Java.

Пользователь должен иметь легкий доступ.он может начать отвечать на экзамен в любом порядке.

Мой подход состоял в том, чтобы создавать пользовательские элементы управления для основных шагов (таких как язык, инструкция и вопрос) и вызывать их на странице по мере нажатия на ссылку.Я только что поместил образец изображения из моего тестового проекта.

enter image description here

Поскольку вопросы выбираются динамически в зависимости от кандидата, я извлекаю все вопросы, создаю список и отображаю его с помощью пошагового управления пользователями Вопроса.

Я много раз создавал мастеров в asp.net, но не в MVC, поэтому у меня есть некоторые сомнения.

Проблемы или проблемы:

Кнопка навигации: NEXT и Previous.Могу ли я поместить его на странице ASPX вместо каждой страницы управления пользователем.

Предположим, что пользователь выбрал одну ссылку, например, скажем, например, для вопроса 1, он ввел ответ и нажал на другую ссылку или кнопку СЛЕДУЮЩИЙ, как я получуобновленный объект с ответом, выбранным пользователем.Поскольку ссылка не имеет действия после публикации.

Если вы, ребята, можете предложить несколько способов достижения этого, это будет очень полезно.

Ниже показана моя страница 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

Language Model View Class

Public Class LanguageVM

    Public Property Description As String

End Class

Вопрос ModelView Class

Public Class QuestionVM
    Public Property Description As String
End Class

UserControls:

ЯЗЫК

<%@ 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 Ответ

1 голос
/ 28 марта 2012

Вы можете сделать следующую и предыдущую кнопки отправки.Если вы дадите им одно и то же имя (в приведенном ниже коде я использовал «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.

Редактировать: Рассматривать ваши новые требования/ code, мой совет, что язык и вопросы не должны использовать одно и то же действие.Вместо этого сделайте так, чтобы они оба унаследовали базовую модель, которая содержит все данные вашего меню, и создайте общий вид, который они оба используют, который создает меню кнопок отправки.

Похоже, вы пытаетесь частичноотправить веб-страницу так, как вы можете частично отправить формы Windows.Я не знаю, возможно ли это, если вы не используете ajax / javascript.Используя описанный мной метод, вы все равно будете публиковать всю страницу, но если у вас будут разные действия по обработке сообщений с вопросами / языком, вам будет легче обрабатывать каждое из них.

...