2016-04-12 6 views
1

Ich bin neu bei MVC und ich baue eine Website mit ASP.Net MVC5.Ich bin ein wenig verwirrt mit dem Routing-Konzept. Das Folgende ist meine route.config-Datei, die ich habe. Wenn ich auf meine Homepage oder Login - Seite gehe und meine Zugangsdaten eintrage und auf den Submit - Button klicke, sehe ich, dass ich über die Seite zur nächsten Seite gehen kann, auf der ich meine Informationen finde, aber der URI ändert sich in den Namen des Post-Aktion, die die Senden-Schaltfläche ausgelöst hat. wenn meine Heimat Login-Seite URI zum Beispiel ist diesesMVC Routing - URL ändert sich, wenn die Schaltfläche zum Senden geklickt wird

http://localhost/Home/

wenn anschließend auf die URL geklickt wird

http://localhost/home/submit aber die Ansicht, dass ich geladen wird Account nicht sicher, genannt, wie das funktioniert.

Auch ich die Benutzerinformationen in einer Sitzung speichern und es gibt eine Abmelden-Schaltfläche, wenn ich auf die Schaltfläche klicken Ich setze die Sitzung auf null und umleiten auf die Login-Aktion, aber dann ändert sich meine URL zu so etwas, obwohl ich keine URL habe, die einen Parameter als Teil der URL in meiner route.config hat.

http://localhost/Home/Login?SourceSeqNo=0&SessionSeqNo=0&AsOfDate=4%2F12%2F2016&NumberOfContracts=0&NumberOfPassDueContracts=0

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

     routes.MapRoute(
     name: "Test", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "TESTVIEW", id = 
     UrlParameter.Optional } 
     ); 

     routes.MapRoute(
     name: "Invoice", 
     url: "{Home}/{Invoice}/{q}", 
     defaults: new { controller = "Home", action = "GetInvoice", q = 
     UrlParameter.Optional } 
     ); 

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

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

     routes.MapRoute(
      name: "Accounts", 
      url: "{controller}/{action}", 
      defaults: new { controller = "Home", action = "AccountStatus" } 
     ); 

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

     routes.MapRoute(
      name: "Home", 
      url: "Home", 
      defaults: new { controller = "Home", action = "Login"} 
     ); 
     routes.MapRoute(
      name: "Home1", 
      url: "", 
      defaults: new { controller = "Home", action = "Login" } 
     ); 

    } 

Aktion Methode

/// <summary> 
    /// Logoffs this instance. 
    /// </summary> 
    /// <returns></returns> 
    public ActionResult Logoff() 
    { 
     Session["AccountInfo"] = null; 
     //return View("Login"); 
     return RedirectToAction("Login", new CustomerModel()); // 
    View("Login", new CustomerModel()); 
    } 

abschicken Aktion unter

[ValidateAntiForgeryToken] 
    public ActionResult Submit(CustomerModel customerModel) 
    { 
     homeAccountViewModel = new HomeAccountStatusViewModel(); 
     homeAccountViewModel.Customer = customerModel;   

     if (ModelState.IsValidField("Username") && 
     (ModelState.IsValidField("Password"))) 
     { 
      logic here.... 

      return View("AccountStatus", homeAccountViewModel); 
     } 
     else 
     { 
      return View("Login", customerModel); 
     }    
    } 

Jede Hilfe wird ein großer Gefallen sein. Dank

+0

Wie sieht Ihre "Submit" -Aktionsmethode aus? – Shyju

+0

Wie wäre es mit: 'Session.Clear(); Session.Abandon(); '? – Hackerman

+0

Ich habe bearbeitet, um die Submit-Aktionsmethode anzuzeigen. – Blossom

Antwort

0

Wenn Ihre Aktion-Methode ausgeführt wird, die Sie anrufen:

return RedirectToAction("Login", new CustomerModel()); 

Dies nutzt die scheidende Route eine URL zu erstellen. Ausgehende Routen verwenden den Controller, die Aktion und alle Routenwerte, um eine passende Route zu finden.

In diesem Fall Ihr Controller vorausgesetzt Home ist (da Sie nicht angegeben haben) und die Aktion als Register angeben, wird diese Route angepasst werden:

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

Und die obige Route erzählt die Routing Engine, um eine URL mit {controller}/{action}/{id} zu erstellen. In diesem Fall ist die ID optional, daher wird sie von der resultierenden URL weggelassen.

HINWEIS: würde ich nachlässig, wenn ich nicht geklappt hat hinweisen, dass Ihr Routing vollständig falsch konfiguriert ist. Das Routing-Framework kann den Unterschied zwischen {controller}/{action}/{id} und {Home}/{Invoice}/{q} für eine eingehende Route nicht unterscheiden. Die Situation wird noch schlimmer, wenn Sie optionale Werte haben. Beide Ihrer ersten beiden Routen entsprechen jeder URL mit 0, 1, 2 oder 3 Segmenten. Da die erste Übereinstimmung immer gewinnt, wird Ihre zweite (und die meisten anderen Routen) niemals erreicht.

Weitere Informationen finden Sie unter Why map special routes first before common routes in asp.net mvc?.

+0

Danke für die Antwort, ich spielte mit meinen Routen herum und ich fand heraus, was du gesagt hast. Da keine meiner Routen irgendwelche Parameter haben und alle von ihnen das gleiche Muster haben werden, denke ich, dass ich nicht so viele Routen angeben muss, jedoch gibt es ein paar Zweifel, die mich stören, für eine bestimmte Route, die wir sind Das ist der Controller und das ist die Aktion, wie wird es dann eine andere Aktion auslösen? Ich hoffe, du hast verstanden, was ich zu sagen versuche – Blossom

+0

Das ist, wofür die Standardwerte sind. Wenn Sie eine oder mehrere Variablen aus der URL entfernen und Literalsegmente verwenden, kann die URL diese nicht von den Standardwerten ändern. Sehen Sie sich noch einmal meine [verknüpfte Antwort] an (http://stackoverflow.com/questions/35661062/why-map-special-routes-first-before-common- routes-in-asp-net-mvc/35674633). Ich habe es mit einer Liste von Optionen aktualisiert, um diese Art von Konfigurationsproblem zu beheben. – NightOwl888

+0

Vielen Dank für diesen Link. Es hat wirklich geholfen. – Blossom