Zoeken…


Invoering

Routing is hoe ASP.NET MVC een URI aan een actie koppelt. De routeringsmodule is verantwoordelijk voor het in kaart brengen van inkomende browserverzoeken aan bepaalde MVC-controlleracties.

MVC 5 ondersteunt een nieuw type routering, attribuutroutering genaamd. Zoals de naam al aangeeft, gebruikt attribuutroutering attributen om routes te definiëren. Attribuutroutering geeft u meer controle over de URI's in uw webapplicatie.

Aangepaste routing

Aangepaste routing biedt gespecialiseerde behoefte aan routing om specifieke inkomende aanvragen te verwerken.

Houd er rekening mee dat de volgorde van routes die u toevoegt aan de routetabel belangrijk is om aangepaste routes te definiëren.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
    // this is an advanced custom route
    // you can define custom URL with custom parameter(s) point to certain action method
    routes.MapRoute(
    "CustomEntry", // Route name
    "Custom/{entryId}", // Route pattern
    new { controller = "Custom", action = "Entry" } // Default values for defined parameters above
    );

    // this is a basic custom route
    // any custom routes take place on top before default route
    routes.MapRoute(
    "CustomRoute", // Route name
    "Custom/{controller}/{action}/{id}", // Route pattern
    new { controller = "Custom", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above
    );

    routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // Route pattern
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above
    );
}

controller en action namen zijn gereserveerd. Standaard wijst MVC {controller} deel van de URL toe aan de klasse <controller>Controller en zoekt vervolgens naar een methode met de naam <action> zonder toevoeging van achtervoegsels.

Hoewel het verleidelijk kan zijn om een familie van routes te maken met behulp van de sjabloon {controller}/{action}/{parameter} bedenk dan dat je hiermee de structuur van je applicatie onthult en URL's ietwat broos maakt omdat het wijzigen van de naam van de controller de route en verbreekt de links die door de gebruiker zijn opgeslagen.

Verkies expliciete route-instelling:

routes.MapRoute(
    "CustomRoute", // Route name
    "Custom/Index/{id}", // Route pattern
    new { controller = "Custom", action = nameof(CustomController.Index), id = UrlParameter.Optional }
);

(u kunt de nameof operator niet gebruiken voor de controller-naam omdat deze een extra achtervoegsel Controller ) die moet worden weggelaten bij het instellen van de controller-naam in de route.

Aangepaste route toevoegen in Mvc

Gebruiker kan aangepaste route toevoegen en een URL toewijzen aan een specifieke actie in een controller. Dit wordt gebruikt voor zoekmachineoptimalisatie en om URL's leesbaar te maken.

routes.MapRoute(
  name: "AboutUsAspx", // Route name
  url: "AboutUs.aspx",  // URL with parameters
  defaults: new { controller = "Home", action = "AboutUs", id = UrlParameter.Optional }  // Parameter defaults
);

Attribuutroutering in MVC

Samen met de klassieke manier van routedefinitie introduceerde MVC WEB API 2 en vervolgens MVC 5 frameworks Attribute routing :

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
        // This enables attribute routing and must go  before other routes are added to the routing table.
        // This makes attribute routes have higher priority
        routes.MapMvcAttributeRoutes();  
    }
}

Voor routes met hetzelfde voorvoegsel in een controller, kunt u een gemeenschappelijk voorvoegsel instellen voor volledige RoutePrefix in de controller met RoutePrefix kenmerk RoutePrefix .

[RoutePrefix("Custom")]
public class CustomController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    {
        ...
    }
}

RoutePrefix is optioneel en definieert het deel van de URL dat voorafgaat aan alle acties van de controller.

Als u meerdere routes hebt, kunt u een standaardroute instellen door actie als parameter vast te leggen en deze vervolgens voor de gehele controller toepassen, tenzij een specifiek Route is gedefinieerd op bepaalde actiemethode (n) die de standaardroute overschrijven.

[RoutePrefix("Custom")]
[Route("{action=index}")]
public class CustomController : Controller
{
    public ActionResult Index()
    {
        ...
    }

    public ActionResult Detail()
    {
        ...
    }
}

Basisbeginselen van routing

Wanneer u de url yourSite/Home/Index aanvraagt via een browser, zal de yourSite/Home/Index verzoek yourSite/Home/Index naar de Index HomeController klasse HomeController . Hoe weet het om het verzoek naar de specifieke methode van deze specifieke klasse te sturen? daar komt de RouteTable.

Elke applicatie heeft een routetabel waar het routepatroon wordt opgeslagen en informatie over waar het verzoek naartoe moet worden geleid. Dus wanneer u uw mvc-toepassing maakt, is er al een standaardroute geregistreerd in de routeringstabel. U kunt dat zien in de klasse RouteConfig.cs .

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

U kunt zien dat het item een naam en een sjabloon heeft. De sjabloon is het routepatroon dat moet worden gecontroleerd wanneer een aanvraag binnenkomt. De standaardsjabloon heeft Home als de waarde van het URL-segment van de controller en Index als de waarde voor het actiesegment. Dat betekent dat als u niet expliciet een controllernaam en actie in uw verzoek doorgeeft, deze standaardwaarden worden gebruikt. Dit is de reden dat u hetzelfde resultaat krijgt wanneer u yourSite/Home/Index en yourSite

Je hebt misschien gemerkt dat we een parameter met de naam id hebben als het laatste segment van ons routepatroon. Maar in de standaardinstellingen specificeren we dat het optioneel is. Dat is de reden dat we de id-waarde niet hoefden te specificeren in de URL die we probeerden.

Ga nu terug naar de Index-actiemethode in HomeController en voeg daar een parameter aan toe

public ActionResult Index(int id)
{
     return View();
}

Zet nu een visueel studiobreekpunt in deze methode. Voer uw project uit en open yourSite/Home/Index/999 in uw browser. Het breekpunt wordt geraakt en u zou moeten kunnen zien dat de waarde 999 nu beschikbaar is in de parameter id .

Een tweede routepatroon maken

Laten we zeggen dat we het zo willen instellen dat dezelfde actiemethode wordt gebruikt voor een ander routepatroon. We kunnen dat doen door een nieuwe routedefinitie aan de routetabel toe te voegen.

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
   
   // New custom route definition added
   routes.MapRoute("MySpecificRoute",
    "Important/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });

   //Default catch all normal route definition
   routes.MapRoute("Default", "{controller}/{action}/{id}",
             new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}

De nieuwe definitie die ik heb toegevoegd, heeft een patroon Important/{id} waarbij id opnieuw optioneel is. Dat betekent dat wanneer u yourSiteName\Important of yourSiteName\Important\888 aanvraagt, deze naar de Index-actie van HomeController wordt verzonden.

Volgorde van registratie van routedefinitie

De volgorde van route-registratie is belangrijk. U moet altijd de specifieke routepatronen registreren vóór de generieke standaardroute.

Catch-all route

Stel dat we een route willen met een ongebonden aantal segmenten zoals:

We zouden een route moeten toevoegen, normaal aan het einde van de routetabel, omdat dit waarschijnlijk alle aanvragen zou vangen, zoals hier:

routes.MapRoute("Final", "Route/{*segments}",
      new { controller = "Product", action = "View" });

In de controller kan een actie die dit aankan zijn:

public void ActionResult View(string[] segments /* <- the name of the parameter must match the name of the route parameter */)
{
    // use the segments to obtain information about the product or category and produce data to the user
    // ...
}

Verzamelroute voor het inschakelen van client-side routing

Het is een goede gewoonte om de status van Single Page Application (SPA) te coderen in url:

my-app.com/admin-spa/users/edit/id123

Hiermee kunt u de applicatiestatus opslaan en delen.
Wanneer de gebruiker de URL in de adresbalk van de browser plaatst en de server binnenkomt, moet het client-gedeelte van de gevraagde URL worden genegeerd. Als u uw SPA weergeeft als een gerenderde Razor-weergave (resultaat van het aanroepen van de controlleractie) in plaats van een statisch HTML-bestand, kunt u een verzamelroute gebruiken:

public class AdminSpaController
{
    [Route("~/admin-spa/{clienSidePart*}")]
    ActionResult AdminSpa()
    {
        ...
    }
}

In dit geval retourneert de server alleen SPA en initialiseert deze zichzelf vervolgens volgens de route. Deze benadering is flexibeler omdat deze niet afhankelijk is van de url-rewrite- module.

Attribuutroutering in gebieden

Voor het gebruik van Attribute Routing in gebieden zijn registratie van gebieden en [RouteArea(...)] definities vereist.

In RouteConfig.cs :

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes();
        AreaRegistration.RegisterAllAreas();
    }
}

In een voorbeeldgebiedcontroller definitie van kenmerkrouting:

[RouteArea("AreaName", AreaPrefix = "AreaName")]
[RoutePrefix("SampleAreaController")]
public class SampleAreaController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    {
        return View();
    }
}

Voor het gebruik van Url.Action koppelingen in gebieden:

@Url.Action("Index", "SampleAreaController", new { area = "AreaName" })


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow