2016-08-17 7 views
0

Ich habe die folgende AktionMVC RedirectToAction nicht versteckt Parameter

public ActionResult TemplateBuilder(int id, int? processId) { } 

Und dann habe ich die folgende

@Url.Action("TemplateBuilder","InspectionTemplate")/id/processId 

Die URL dann wie folgt aussieht: InspectionTemplate/TemplateBuilder/1/2

Aber wenn ich

return RedirectToAction("TemplateBuilder","InspectionTemplate", new { id=1, processId = 2}); 

Dann bekomme ich folgendes Ergebnis: InspectionTemplate/TemplateBuilder/1?processId=2

Wie kann ich das beheben?

Hier ist mein Routing

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


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

     routes.MapRoute(
      name: "ProcessRoute", 
      url: "{controller}/{action}/{id}/{processId}", 
      defaults: new 
      { 
       controller = "InspectionTemplate", 
       action = "TemplateBuilder", 
       id = UrlParameter.Optional, 
       processId = UrlParameter.Optional 
      } 
     ); 

     routes.MapRoute(
      name: "DateRoute", 
      url: "{controller}/{action}/{year}/{month}/{day}", 
      defaults: new 
      { 
       controller = "Inspection", 
       action = "Assign", 
       year = UrlParameter.Optional, 
       month = UrlParameter.Optional, 
       day = UrlParameter.Optional 
      } 
     ); 


    } 
+2

entfernen 'id = UrlParameter.Optional,' von der 'ProcessRoute' (nur der letzte Parameter kann optional sein) und ändern Sie ihn auf' url: „InspectionTemplate/{ action}/{id}/{processId} "," so ist es spezifisch und verschiebe es auf die erste Route (die Reihenfolge ist wichtig) –

+0

Es hat nicht funktioniert :( –

+0

Nevermind, es funktionierte vergessen, es an die Spitze zu bewegen. Als Antwort hinzufügen, damit ich es akzeptieren kann. –

Antwort

1

Sie haben 3 Probleme mit der Routendefinition

  1. Nur der letzte Parameter in einer Routendefinition kann mit UrlParameter.Optional markiert werden. Wenn Sie nur einen angeben sollten, kann die Routing-Engine nicht wissen, welcher Parameter gebunden werden soll ( ), damit der/die Wert (e) als Abfragezeichenfolgenparameter hinzugefügt werden).
  2. Das Hauptproblem ist jedoch die Reihenfolge der Routen. Das Routing
    Engines durchsucht die Definitionen in der Reihenfolge, in der sie deklariert sind, und stoppt, sobald es ein übereinstimmendes findet, und in Ihrem Fall wird die
    IDRoute übereinstimmen, so dass die Routen ausgetauscht werden müssen.
  3. Dies allein kann jedoch Probleme mit anderen Routendefinitionen verursachen. Daher empfiehlt es sich, Ihre Route eindeutig identifizierbar zu machen, z. B. durch unter Angabe des Controllernamens in der Routendefinition.

sollten Ihre Definitionen sein

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

    routes.MapRoute(
     name: "ProcessRoute", 
     url: "InspectionTemplate/{action}/{id}/{processId}", 
     defaults: new { controller = "InspectionTemplate", action = "TemplateBuilder", processId = UrlParameter.Optional } 
    ); 

    routes.MapRoute(
     name: "DateRoute", 
     url: "Inspection/{action}/{year}/{month}/{day}", 
     defaults: new { controller = "Inspection", action = "Assign", } // assumes all parameters are required 
    ); 

    // The default will only be match if the url does not start with '/InspectionTemplate/' or '/Inspection/' 
    routes.MapRoute(
     name: "IDRoute", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional } 
    ); 
} 
Verwandte Themen