2017-02-20 3 views
0

Я играю с ASP.net C# MVC Framework, пытающейся запрограммировать какой-либо тест оценки. Я довольно новичок в ASP.net (довольно свободно владею C#), однако я постоянно получаю тот же странный результат:C# MVC-приложение нежелательное перенаправление

Ok. Как это работает, в основном, возникает вопрос с некоторыми ответами -> пользователь должен выбрать ответ, который он считает правильным, и нажать «Продолжить» (кнопка «Далее»). Ну, что я делаю, я читаю все вопросы/ответы и другую информацию из XML-файла (правильно работает, без сомнения, я могу видеть в отладчике правильную информацию). Однако то, что я знаю, хочу сделать это после завершения около 18 вопросов, чтобы перенаправить пользователя на какой-то странице результатов

public ActionResult Result() 
     { 

      ViewBag.Message = "Your result page."; 

      return View(_questionProcessing); 
     } 

который Мента быть вызван, когда все вопросы отвечает (вызов метода из Question). Однако по какой-то причине он уже перескакивает на страницу результатов после четвертого вопроса.

Я отлаживал приложение в течение нескольких часов, но не смог найти причину.

Если кто-то может помочь, спасибо вам большое!

Вопрос 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

Когда вы отлаживаете 4-й вопрос, что такое значение «_questionProcessing.QuestionModels.Questions.Count»? –

+0

FWIW, контроллеры создаются и уничтожаются с каждым запросом. В результате вы должны помнить, что ваш экземпляр 'QuestionProcessing' будет новым для каждого запроса. Возможно, вы уже знаете об этом, но я нервничаю, когда вижу, как люди вручную устанавливают ивары на контроллерах. –

ответ

2

Вы вероятно не хотят этого:

RedirectToActionPermanent("Result"); 

Это отвечает браузер с кодом ответа HTTP 301 Moved, указывающим, что ресурс он просто попросил волю всегда приводят к переадресации, и он должен просто запрашивать перенаправленный ресурс самостоятельно.

Но это не то, что вы хотите. Вы хотите, чтобы браузер продолжать запрашивать Question ресурс до тех пор, пока явно сказать ему, чтобы выполнить переадресацию, что и это будет делать:

RedirectToAction("Result"); 

Это отвечает с кодом ответа HTTP 302 Found, который сообщает браузеру перенаправить пользователя «на этот раз», но необязательно в будущих запросах.

В принципе, если во время тестирования вы когда-либо делали запрос, который привел к перенаправлению, все будущие запросы от этого браузера могли перейти непосредственно на перенаправленную страницу без отправки запроса на сервер.

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

+0

Извините, это не имеет значения - когда я отлаживаю, я вижу, что метод redirectToAction никогда не вызывается. Запросить метод Result() непосредственно вызывается откуда-то. Я действительно не знаю – Schaschi

+0

Возможно, вы захотите обратиться к 301 Moved vs. 302 Found. – ErikE

+2

@Schaschi: Когда вы отлаживаетесь из браузера, каков фактический запрос HTTP, который он делает? Если вы не очистили данные браузера, он по-прежнему будет следовать переадресации, о которой вы ранее говорили, на * постоянно. – David

Смежные вопросы