2017-02-20 1 views
0

저는 일종의 평가 테스트를 프로그래밍하려고 시도한 ASP.net C# MVC 프레임 워크를 가지고 놀았습니다. 나는 ASP.net에 상당히 익숙하다. (C#에 능통하다.) 그러나 나는 계속해서 이상한 결과를 얻고있다 :C# MVC 응용 프로그램 원치 않는 리디렉션

Ok. 작동 원리는 기본적으로 일부 답변이있는 질문이 나타납니다.> 사용자가 답을 올바르게 선택하고 진행을 클릭해야합니다 ('다음'버튼). 글쎄, 내가 할 일은 XML 파일에서 모든 질문/답변 및 기타 정보를 읽는 것입니다 (올바로 디버거에서 정확한 정보를 볼 수 있다는 점에 대해서는 의심의 여지가 없습니다). 그러나 내가하고 싶은 알고있는 모든 질문 (질문 방법에서 호출) 응답 할 때 호출 될, 표준은 결과 페이지

public ActionResult Result() 
     { 

      ViewBag.Message = "Your result page."; 

      return View(_questionProcessing); 
     } 

의 일종으로 사용자를 리디렉션 약 18 질문을 완료 한 후입니다. 그러나 어떤 이유로 4 번째 질문 이후에 결과 페이지로 이동합니다.

지금 몇 시간 동안 응용 프로그램을 디버깅했지만 원인을 찾을 수 없었습니다.

누군가가 도와 주시면 감사하겠습니다.

[질문 cshtml

@using Assessify.Models 
@model Assessify.Models.QuestionProcessing 
@{ 

    ViewBag.Title = "Question"; 
    <link href="@Url.Content("~/Content/Question.css")" rel="stylesheet" type="text/css"/> 
} 


<div class="container outerQuestionContainer"> 


    <div class="row"> 
     <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12 well"> 
      <h2>Question @((Model.questionIterator + 1).ToString())</h2> 
     </div> 
    </div> 

    <div class="row"> 

      <div class="row"> 
       <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12"> 
        <div class="imageToQuestion"> 

         <img src="@Model.QuestionModels.Questions[Model.questionIterator].Bildurl" class="img-rounded img-responsive" alt="myImagetitle" id="questionImage"/> 
        </div> 
       </div> 
       <div class="col-lg-6 col-md-6 col-sm-12 col-xs-12"> 
        <div class="well cFragesatz"> 
         @Html.Label("Expression", Model.QuestionModels.Questions[Model.questionIterator].Fragesatz) 
        </div> 


        <div class="divAntworten"> 
         <div class="divAntwort" style="color: white"> 

          @foreach (Antwort antwort in Model.QuestionModels.Questions[Model.questionIterator].Antworten) 
          { 
           <div class="well divAntwortStyle"> 

            @Html.CheckBox(antwort.Antwortphrase, false) 
            @Html.Label(antwort.Antwortphrase) 

           </div>  
          } 
         </div> 
        </div> 
       </div> 


       <div class="row rowButton"> 
        <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> 
         @{ 
          Model.questionIterator = Model.questionIterator + 1; 
         } 
         <button type="button" class="btn btn-info" style="width: 100%"> @Html.ActionLink("Next", "Question", "Home", new {counter = Model.questionIterator}, null)</button> 
        </div> 
       </div> 


      </div> 

    </div> 

</div> 

데이터 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Xml.Linq; 

namespace Assessify.Models 
{ 
    public class QuestionModels 
    { 
     public List<Question> Questions { get; set; } 

     public QuestionModels(String Path) 
     { 
      var xdox = XElement.Load(Path); 

      var e = from c in xdox.Descendants("Frage") 
        select new Question() 
        { 
         FrageId = int.Parse((string) c.Attribute("fNumb").Value), 
         Category = (string)c.Attribute("fCategory").Value, 
         Fragesatz = (string)c.Element("Fragesatz").Value, 
         Bildurl = (string)c.Element("Bildurl").Value, 
         Antworten = from a in c.Elements("Antwort") 
            select new Antwort() 
            { 
             Antwortphrase = a.Value, 
             isTheCorrect = Boolean.Parse((string) a.Attribute("isTrue").Value) 
            } 
        }; 
      Questions = e.ToList(); 

     } 

    } 

    public class Question 
    { 
     public String Fragesatz { get; set; } 
     public IEnumerable<Antwort> Antworten { get; set; } 
     public int FrageId { get; set; } 
     public String Bildurl { get; set; } 
     public String Category { get; set; } 

     public Boolean wasAnsweredCorrectly = false; 

     public Decimal Weight { get; set; } 

    } 

    public class Antwort 
    { 
     public String Antwortphrase { get; set; } 
     public Boolean isTheCorrect { get; set; } 
    } 
} 

namespace Assessify.Models 
{ 
    public class QuestionProcessing 
    { 
    public QuestionModels QuestionModels { get; set; } 
    public int questionIterator { get; set; } 

    public QuestionProcessing(String link) 
    { 
     QuestionModels = new QuestionModels(link); 
     questionIterator = 0; 
    } 

} 

Homecontroller :

namespace Assessify.Controllers 
{ 
    public class HomeController : Controller 
    { 
     QuestionProcessing _questionProcessing = new QuestionProcessing(@"C:\Users\thoma\Documents\Visual Studio 2015\Projects\Assessify\Assessify\Models\Ressources\Fragefile_new.xml"); 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult About() 
     { 
      ViewBag.Message = "Your application description page."; 

      return View(); 
     } 

     public ActionResult Contact() 
     { 
      ViewBag.Message = "Your contact page."; 

      return View(); 
     } 

     public ActionResult Question(int counter = 0)  
     { 
      ViewBag.Message = "Your question page."; 

      this._questionProcessing.questionIterator = counter; 

      if (_questionProcessing.questionIterator >= _questionProcessing.QuestionModels.Questions.Count) 
      { 

       return RedirectToActionPermanent("Result"); 
      } 

      return View(this._questionProcessing); 
     } 

     public ActionResult Result() 
     { 

      ViewBag.Message = "Your result page."; 

      return View(_questionProcessing); 
     } 



    } 
} 

RouteConfig :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 

namespace Assessify 
{ 
    public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       name: "Question", 
       url: "Home/Question/{counter}", 
       defaults: new { controller = "Home", action = "Question", counter = UrlParameter.Optional } 

      ); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
} 
+0

네 번째 질문에서 디버깅 할 때 "_questionProcessing.QuestionModels.Questions.Count"값은 무엇입니까? –

+0

FWIW, 컨트롤러는 각 요청마다 인스턴스화되고 파괴됩니다. 결과적으로, 당신은'QuestionProcessing' 인스턴스가 각 요청마다 새로 추가된다는 것을 명심해야합니다. 당신은 이미 그것을 알고 있을지 모르지만 사람들이 컨트롤러에 ivars를 수동으로 설정하는 것을 볼 때마다 나는 긴장합니다. –

답변

2

당신 아마이 원하지 않는 :

RedirectToActionPermanent("Result"); 

를이 그냥 항상 의지 요구하는 자원을 나타내는 HTTP 응답 코드 301 Moved와 브라우저에 응답 리다이렉트 결과를 얻고 리디렉션 된 리소스를 자체적으로 요청해야합니다.

하지만 그건 당신이 원하는 것이 아닙니다. 당신은 당신이 명시 적으로이 무엇을 할 것입니다 리디렉션을 수행하도록 지시 때까지 Question 자원을 요청하기 위해 계속 브라우저를 원하는 :

이 브라우저를 알려주는 HTTP 응답 코드 302 Found, 응답
RedirectToAction("Result"); 

사용자를 "이번에는"리디렉션하지만 이후 요청에서는 반드시 그런 것은 아닙니다.

기본적으로 테스트하는 동안 해당 리디렉션을 요청한 요청이 있으면 해당 브라우저의 모든 요청이 서버에 요청을 제출하지 않고 리디렉션 된 페이지로 직접 이동할 수 있습니다.

참고 : 이미 브라우저에 영구적으로 리디렉션하도록 지시 했으므로 브라우저에서 클라이언트 측 데이터를 제거해야만 해당 효과를 제거해야 할 수 있습니다.

+0

죄송합니다. 차이가 없습니다. 디버깅 할 때 redirectToAction 메서드가 호출되지 않습니다. Result() 메소드가 어딘가에서 직접 호출되는 방법을 알리십시오. 나는 정말로 모른다 – Schaschi

+0

당신은 301 Moved 대 302 Found를 구체적으로 언급하고 싶을지도 모른다. – ErikE

+2

@Schaschi : 브라우저에서 디버깅 할 때 실제 HTTP 요청은 무엇입니까? 브라우저의 데이터를 지우지 않았다면 이전에 지시 한 리디렉션을 따라갈 것입니다. – David

관련 문제