2017-02-20 24 views
0

我已經與ASP.net C#MVC框架玩弄試圖編程某種評估測試的。我是相當新的ASP.net(C#中相當流暢),但是,我不斷收到同樣怪異的結果:C#MVC應用程序不需要重定向

確定。它的工作原理基本上是帶有一些答案的問題出現 - >用戶必須選擇他/她認爲正確的答案,然後單擊繼續(Button'Next')。那麼,我所做的是從一個xml文件中讀取所有問題/答案和其他信息(毫無疑問,我可以在調試器中看到正確的信息)。不過我所知道想要做的就是完成約18個問題,將用戶重定向到某種結果頁面

public ActionResult Result() 
     { 

      ViewBag.Message = "Your result page."; 

      return View(_questionProcessing); 
     } 

的是換貨時,所有的問題都回答(從問題的方法調用)被調用後。 但是,由於某種原因,它已經跳到第四個問題之後的結果頁面。

現在我已經調試了好幾個小時的應用程序,但一直沒能找到原因。

如果有人能請大家幫忙,非常感謝你!

問題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資源,直到你明確告訴它執行重定向,這是什麼,這將做到:

RedirectToAction("Result"); 

這與HTTP響應代碼302 Found,它告訴瀏覽器響應重新定向用戶「這次」,但不一定在將來的請求中。

基本上,如果你在測試過程中你曾經提出,導致該重定向請求,從瀏覽器的所有將來的請求可以直接轉到重定向的頁面而不提交請求到服務器。

注意:您可能需要清除瀏覽器中的客戶端數據以消除該效果,因爲您已告知瀏覽器永久重定向。

+0

對不起,這沒有什麼區別 - 當我調試時,我可以看到redirectToAction方法從不被調用。 Instread方法Result()直接從某處調用。我真的不知道 – Schaschi

+0

你可能想具體參考301 Moved與302 Found。 – ErikE

+2

@Schaschi:當你從瀏覽器內部進行調試時,它實際發出的HTTP請求是什麼?如果你還沒有清除瀏覽器的數據,那麼它仍然會遵循你之前告訴它的重定向*永久*跟隨。 – David