2012-01-09 1 views
0

지금 개발중인 웹 응용 프로그램에는 퀴즈 엔진이라는 것이 있습니다.이 퀴즈 엔진은 사용자에게 하나 이상의 질문으로 구성된 짧은 퀴즈를 제공합니다. 이제 퀴즈를 풀거나 답하는 데 문제가 있습니다. 사용자가 퀴즈를 끝내고 결과 페이지로 이동하여 퀴즈 페이지로 돌아가서 같은 질문에 답하면 두 가지 결과가 나옵니다. 왜 그럴지!사용자가 퀴즈의 질문 중 하나에 대한 대답을 어떻게 바꿀 수있게 할 수 있습니까?

간단히 말해서 같은 질문에 여러 번 응답해도 여러 항목이 만들어서는 안됩니다.

퀴즈 엔진을 만들 때 나는 ASP.NET 웹 사이트에서 퀴즈 엔진 용 Toturial을 사용하여 내가 가진 것을 만들었습니다.

내 코드 숨김 :

protected void nextButton_Click(object sender, EventArgs e) 
    { 
     // Save off previous answers 
     System.Data.DataRowView dr = (System.Data.DataRowView)questionDetails.DataItem; 

     // Create Answer object to save values 
     Answer a = new Answer(); 
     a.QuestionID = dr["QuestionOrder"].ToString(); 
     a.CorrectAnswer = dr["CorrectAnswer"].ToString(); 
     a.UserAnswer = answerDropDownList.SelectedValue.ToString(); 

     ArrayList al = (ArrayList)Session["AnswerList"]; 
     al.Add(a); 

     Session.Add("AnswerList", al); 

     if (questionDetails.PageIndex == questionDetails.PageCount - 1) 
     { 
      // Go to evaluate answers 
      Response.Redirect("Results.aspx"); 
     } 
     else 
     { 
      questionDetails.PageIndex++; 
     } 

     if (questionDetails.PageIndex == questionDetails.PageCount - 1) 
     { 
      nextButton.Text = "Finished"; 
     } 

    } 

나는 사용자가 자신의 대답을 변경할 수 있도록하는 방법을 이제 (또는 이동 :이 답변을 저장을 담당하는 코드가

답변 한 질문 중 하나로 돌아가십시오)이 새로운 대답은 이전 답변을 대체합니다 (사용자가 동일한 질문을 두 번 대답 한 것으로 간주되지 않음). 그렇게하는 방법?

편집 :

다음 코드는 결과를 저장하는 책임이있다 : 당신이 AnswerList에 답을 추가하기 전에

다음은

을 시도 할 수있는

resultGrid.DataSource = al; 
     resultGrid.DataBind(); 

     // Save the results into the database. 
     if (IsPostBack == false) 
     { 
      // Calculate score 
      double questions = al.Count; 
      double correct = 0.0; 


      for (int i = 0; i < al.Count; i++) 
      { 
       Answer a = (Answer)al[i]; 
       if (a.Result == Answer.ResultValue.Correct) 
        correct++; 
      } 

      double score = (correct/questions) * 100; 
      string username = HttpContext.Current.User.Identity.Name.ToString().Replace("ARAMCO\\", ""); 
      SqlDataSource userQuizDataSource = new SqlDataSource(); 
      userQuizDataSource.ConnectionString = ConfigurationManager.ConnectionStrings["testConnectionString"].ToString(); 
      userQuizDataSource.InsertCommand = "INSERT INTO [UserQuiz] ([QuizID], [DateTimeComplete], [Score], [Username]) VALUES (@QuizID, @DateTimeComplete, @Score, @Username)"; 

      userQuizDataSource.InsertParameters.Add("QuizID", Session["QuizID"].ToString()); 
      userQuizDataSource.InsertParameters.Add("DateTimeComplete", DateTime.Now.ToString()); 
      userQuizDataSource.InsertParameters.Add("Score", score.ToString()); 
      userQuizDataSource.InsertParameters.Add("Username", username); 

      int rowsAffected = userQuizDataSource.Insert(); 
      if (rowsAffected == 0) 
      { 
       // Let's just notify that the insertion didn't 
       // work, but let' s continue on ... 
       errorLabel.Text = "There was a problem saving your quiz results into our database. Therefore, the results from this quiz will not be displayed on the list on the main menu."; 


      } 

     } 
+0

사용자의 답변 목록을 어떻게 저장하고 있습니까? – V4Vendetta

+0

질문에 대한 대답으로 내 질문을 편집했습니다. – user1093651

답변

2

는 그 질문이 있는지 확인 목록에 이미 있습니다. 예인 경우 현재와 바꾸십시오. DB에 답변을 저장할 때이 작업을 수행해야합니다. 아래 코드는 세션에서만 개체를 ​​업데이트합니다.

// Create Answer object to save values 
Answer a = new Answer(); 
a.QuestionID = dr["QuestionOrder"].ToString(); 
a.CorrectAnswer = dr["CorrectAnswer"].ToString(); 
a.UserAnswer = answerDropDownList.SelectedValue.ToString(); 

ArrayList al = (ArrayList)Session["AnswerList"]; 
var oldAnswer = al.ToArray().Where(ans => (ans as Answer).QuestionID == a.QuestionID); 
if (oldAnswer.Count() != 0) 
{ 
     a = oldAnswer.FirstOrDefault() as Answer; 
     a.CorrectAnswer = dr["CorrectAnswer"].ToString(); 
     a.UserAnswer = answerDropDownList.SelectedValue.ToString(); 
} 
else 
{ 
     al.Add(a); 
} 

//Rest of your code 

희망이 있습니다.

+0

감사합니다. 하지만 그건 그렇고, 내가 코드를 복사해서 디버깅하는 동안 많은 에러가 발생했는데 왜 그런지 모르겠습니다. 다음과 같은 오류가 있습니다 : 오류 'object []'에 'Where'와 확장 메서드가없는 'Where'에 대한 정의가 없습니다. 'object []'유형의 첫 번째 인수를 수락 할 수 있습니다. using 지시문이나 어셈블리 참조?) – user1093651

+1

"Where"는 "System.Linq"에 정의 된 확장 메서드입니다. 그것은 .net 3.5 이상에서 사용 가능합니다. "Where"쿼리를 사용하면, 그 객체가 Session 내에 이미 존재하는지 아닌지를 체크 할 뿐이다. 또한 DB에 대해서도 확인하십시오. 이전에 같은 사용자가 질문에 답변했는지 확인하십시오. –

+1

DB에 응답 저장 코드를 보면 동일한 사용자가 이전에 동일한 질문에 답변 한 경우 UpdateCommand를 사용해야합니다. 데이터베이스 테이블에 각 레코드에 대해 고유 ID/행 ID가 있으면 좋겠다. 레코드를 업데이트 할 때도 동일하게 사용할 수 있습니다. –

0

당신의 논리가 좋을 때도 마찬가지입니다. 또한이 논리를 동일하게 적용합니다. 그러나 사용자가 이전에 해당 세션을 클릭하면 해당 특정 세션을 지우고 새 세션을 추가해야합니다. 종료를 위해 마무리 버튼을 추가하십시오.

+0

네, 맞습니다. 나는 FINISHED 버튼을 추가했지만이 것을 수정해야하고 어떻게 해야할지 모르겠습니다. – user1093651

관련 문제