views:

152

answers:

2

Hi,

Working on a Online Test.

I have 3 tables

  1. Questions
  2. Subject
  3. Topic

I have made a Store Proc which return 25 Random Records. I want to store it in-memory and then display 1 question at a time with AJAX. I don't want to hit database 25 times as there are many users, I tried and store the result in viewstate but then I am not able to cast it back. if I use

Dim qus = from viewstate("questions") its work but it don't work when I retrieve 1 record at a time.

-------------------------------CODE-----------------------------

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        ViewState.Add("QuestionNo", 0)
        Dim qus = From q In PML.PM_SelectRandomQuestionFM Select q
        viewstate.add("questions",qus)
        LoadQuestion(0)
    End If
End Sub



Private Sub LoadQuestion(ByVal i As Integer)
    Dim QuestionNo As Integer = CType(ViewState("QuestionNo"), Integer) + 1

    Try
        If QuestionNo <= 25 Then

            Dim qus = viewstate("questions")

            Me._subjectTopic.Text = String.Format("<b>Subject:</b> {0} -- <b>Topic:</b> {1}", qus(i).subjectName, qus(i).TopicName)
            Me._question.Text = " " & qus(i).Question
            Me._answer1.Text = " " & qus(i).Answer1
            Me._answer2.Text = " " & qus(i).Answer2
            Me._answer3.Text = " " & qus(i).Answer3
            Me._answer4.Text = " " & qus(i).Answer4
            Me._questionNo.Text = String.Format("Question No. {0} / 25", QuestionNo)
            ViewState.Add("QuestionNo", QuestionNo)
        Else
            Server.Transfer("freeMemberResult.aspx")
        End If

    Catch ex As Exception
        Throw New System.Exception(ex.ToString)
    End Try
End Sub

I tried casting the object to

Dim qus = CType(ViewState("questions"), IQueryable(Of PM_SelectRandomQuestionFMResult))

but then I get this error

System.Linq.Enumerable+WhereSelectEnumerableIterator`2

Please HELP or if there is any other method to do it, if my method of doing online test is wrong.

Regards

A: 

Have you tried just using Session to maintain state? Is there a requirement that prohibits you from doing this?

Dim qus = CType(Me.Session("questions"), IQueryable(Of PM_SelectRandomQuestionFMResult))
mattruma
A: 

IMO, you're over-engineering this. Why screw around trying to hold the data in memory? Why not write each question to a div, and then hide all of the question divs except for the "current question".

Much easier to implement and you're not hitting the server with several AJAX calls, This also make saving state (previously answered questions, etc) much, much easier.

mmattax
thanks for the answer, yes I am over engineering it, so should I use jquery to hide div or ajax will do.
Moksha
Plain JavaScript or JQuery would do...
mmattax