2016-04-15 6 views
0

Routing verwenden Ich bin url bekommen wie http://localhost:49671/TestRoutes/Display?f=hi&i=2Wie nur Name in url statt id in mvc.net anzuzeigen

Ich möchte es wie http://localhost:49671/TestRoutes/Display/hi

ich es von Index-Methode aufrufen.

[HttpPost] 
public ActionResult Index(int? e) 
{ 
    // return View("Display", new { f = "hi", i = 2 }); 
    return RedirectToAction("Display", new { f = "hi", i = 2 }); 
} 

Index Ansicht

@model Try.Models.TestRoutes 
@using (Html.BeginForm()) 
{ 
    Model.e = 5 ; 
    <input type="submit" value="Create" class="btn btn-default" /> 
} 

Display Aktion Methode

// [Route("TestRoutes/{s}")] 
public ActionResult Display(string s, int i) 
{ 
    return View(); 
} 

Routenkonfigurationsdatei

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapRoute(
     "Professional", // Route name 
     "{controller}/{action}/{id}/{name}", // URL with parameters 
     new { controller = "TestRoutes", action = "Display", s = UrlParameter.Optional, i = UrlParameter.Optional 
    }); 
    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional 
    }); 
+0

Sie Route Definitionen müssen übereinstimmen die Parameternamen - '" TestRoutes/Display/{s}/{i} "' (und nur der letzte Parameter kann 'UrlParameter.Optional' sein) –

+0

Ich kann es nicht richtig codieren, kann ich Attribute anstelle von Maproute-Sache verwenden ? – Nil

+0

Was funktioniert nicht? Es muss nur 'routes.MapRoute (Name:" Professional ", URL:" TestRoutes/Anzeige/{s}/{i} ", neu {controller =" TestRoutes ", action =" Display "}) sein;'. Aber in Ihrer 'Index()' Methode muss es sein 'return RedirectToAction (" Anzeige ", neu {s =" hi ", i = 2});' (nicht 'f') –

Antwort

2

Sie benötigen eine Routendefinition zu

routes.MapRoute(
    name: "Professional", 
    url: "TestRoutes/Display/{s}/{i}", 
    default: new { controller = "TestRoutes", action = "Display", i = UrlParameter.Optional } 
); 

so ändern, dass die Namen der Platzhalter die Namen der Parameter in Ihrer Methode entsprechen. Beachten Sie auch, dass nur der letzte Parameter als UrlParameter.Optional markiert werden kann (andernfalls kann die RoutingEngine die Segmente nicht abgleichen und die Werte werden als Abfragezeichenfolgeparameter und nicht als Routenwerte hinzugefügt)

Dann müssen Sie die Controller-Methode ändern, damit sie übereinstimmt Die Route/Methode Parameter

[HttpPost] 
public ActionResult Index(int? e) 
{ 
    return RedirectToAction("Display", new { s = "hi", i = 2 }); // s not f 
} 
+0

Standard vor neuen :) – Nil

+0

Lazy Ausschneiden und Einfügen :) –

+0

Ich habe nicht tun Sie es absichtlich, ich glaube, es war ein Klick aus Versehen, ich wusste nicht einmal, wann ich geklickt habe. So leid. – Nil

0

Änderung Ihrer Route als routes.MapRoute ( "Professional", // Name der Route "{Controller}/{Aktion}/{name}", // URL mit Parametern neue { controller = "TestRoutes", action = "Anzeige" } // Parametervorgaben );

und Ihre Aktion als

public ActionResult Display(string name) 
{ 
    //action goes here 
} 
+0

Ich kann ID-Eigenschaft für weitere Operationen benötigen. Aber selbst wenn ich es entferne, kann ich keine Änderungen in der URL sehen. Wenn es Ihnen möglich ist, können Sie ein wenig ausarbeiten? – Nil

+0

Fügen Sie dann ein weiteres Attribut in der Routen-URL hinzu, z. B. routes.MapRoute ("Professional", "{Controller}/{Aktion}/{Name}/{ID}", Neu {controller = "TestRoutes", action = " Display ", id = UrlParameter.Optional}, und Aktion wie öffentliche ActionResult Display (String-Name, int? Id) {// Aktion geht hier} – user3275644

0

Entfernen Sie den MapRoute Code: routes.MapRoute ( "Professional", // Name der Route „{Controller}/{Aktion}/{id}/{name } ", // URL mit Parametern new {controller =" TestRoutes ", action =" Anzeige ", s = UrlParameter.Optional, i = UrlParameter.Optional }); Verwenden Attribut Routing-Code: [Weg ("TestRoutes/{s}/{i}?")] public Action Display (String s, int i?) { return View(); }

0

Sie können auch versuchen, Attribut Routing zu verwenden. Mit Attributrouting können Sie Ihre Routen einfacher steuern.

Zuerst ändern Sie Ihre RouteConfig.cs wie folgt aus:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.MapMvcAttributeRoutes(); 
     //routes.MapRoute(
     // name: "Default", 
     // url: "{controller}/{action}/{id}", 
     // defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     //); 
    } 
} 

Danach Ihre Controller-Dateien wie das ändern:

namespace YourProjectName.Controllers 
{ 
    [RoutePrefix("Home")] 
    [Route("{action}/{id=0}")] 
    public class HomeController : Controller 
    { 
     [Route("Index")] 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [Route("ChangeAddress/{addressID}")] 
     public ActionResult ChangeAddress(int addressID) 
     { 
      //your codes to change address 
     } 
} 

Sie auch mehr über Attribut Routing in diesem Beitrag nicht lernen kann: https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/

+0

Danke für den Link, aber ich bekomme keine Lösung. Meinst du ich sollte diff-Controller zum routing schreiben? – Nil

+0

Nein, ** RouteConfig.cs ** befindet sich im Ordner "App_Start" in Ihrem MVC-Projekt. Wenn Sie Attribut-Routing verwenden möchten, müssen Sie Ihren RouteConfig.cs-Inhalt und Ihre anderen Controller wie in meinem Post ändern. Ich denke, Attribute Routing ist eine flexiblere Lösung als Convention Routing. Und Sie können Ihre Routen leicht steuern. – kkakkurt

+0

Attribut-Routing funktioniert nicht für mich (ich bin nicht in der Lage, es zu verwenden, ich meinte) Ich bekomme Standard-URL mit ID? etc – Nil