Dela via


Razor Sidors routnings- och appkonventioner i ASP.NET Core

Lär dig hur du använder providerkonventioner för sidväg och appmodell för att styra sidroutning, identifiering och bearbetning i Razor Pages-appar.

Om du vill ange en sidväg, lägga till vägsegment eller lägga till parametrar i en väg använder du sidans @page direktiv. Mer information finns i Anpassade vägar.

Det finns reserverade ord som inte kan användas som routningssegment eller parameternamn. Mer information finns i Routning: Reserverade routningsnamn.

Visa eller ladda ned exempelkod (hur du laddar ned)

Scenario Exemplet visar
Modellkonventioner

Conventions.Add
Lägg till en routningsmall och rubrik på en apps sidor.
Routningskonventioner för sidor Lägg till en vägmall till sidor i en mapp och på en enda sida.
Åtgärdskonventioner för sidmodell Lägg till ett sidhuvud på sidor i en mapp, lägg till en rubrik på en enda sida och konfigurera en filterfabrik för att lägga till en rubrik på en apps sidor.

Razor Sidkonventioner konfigureras med hjälp av en AddRazorPages överbelastning som konfigurerar RazorPagesOptions. Följande konventionsexempel beskrivs senare i det här avsnittet:


var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages(options =>
    {
        options.Conventions.Add( ... );
        options.Conventions.AddFolderRouteModelConvention(
            "/OtherPages", model => { ... });
        options.Conventions.AddPageRouteModelConvention(
            "/About", model => { ... });
        options.Conventions.AddPageRoute(
            "/Contact", "TheContactPage/{text?}");
        options.Conventions.AddFolderApplicationModelConvention(
            "/OtherPages", model => { ... });
        options.Conventions.AddPageApplicationModelConvention(
            "/About", model => { ... });
        options.Conventions.ConfigureFilter(model => { ... });
        options.Conventions.ConfigureFilter( ... );
    });
}

Routningsordning

Rutter anger en Order för bearbetning (rutmatchning).

Routningsordning Behavior
-1 Vägen bearbetas innan andra vägar bearbetas.
0 Order har inte angetts (standardvärde). Om du inte tilldelar Order (Order = null) resulterar det i att standardvägen Order sätts till 0 (noll) för bearbetning.
1, 2, … n Anger behandlingsordning för rutt.

Vägbearbetning upprättas enligt konventionen:

  • Vägar bearbetas i sekventiell ordning (-1, 0, 1, 2, ... n).
  • När vägarna har samma Ordermatchas den mest specifika vägen först följt av mindre specifika vägar.
  • När vägar med samma Order och samma antal parametrar matchar en url för begäran bearbetas vägar i den ordning som de läggs till i PageConventionCollection.

Försök om möjligt att undvika att förlita dig på en etablerad ruttbehandlingsordning. I allmänhet väljer routning rätt väg med URL-matchning. Om du måste ange routningsegenskaper Order för att dirigera begäranden korrekt är appens routningsschema förmodligen förvirrande för klienter och bräckligt att underhålla. Försök att förenkla appens routningsschema. Exempelappen kräver en explicit vägbearbetningsordning för att demonstrera flera routningsscenarier med hjälp av en enda app. Du bör dock försöka undvika att ange vägen Order i produktionsappar.

Razor Sidroutning och MVC-styrenhetsroutning delar en implementering. Information om routningsordning i MVC-ämnena finns i Routning till kontrollantåtgärder: Ordna attributvägar.

Modellkonventioner

Lägg till ett ombud för IPageConvention att lägga till modellkonventioner som gäller för Razor Sidor.

Lägga till en routningsmodellkonvention på alla sidor

Använd Conventions för att skapa och lägga till en IPageRouteModelConvention i samlingen av IPageConvention instanser som tillämpas under konfigurationen av sidans ruttmodell.

Den exempelapp innehåller klassen GlobalTemplatePageRouteModelConvention för att lägga till en {globalTemplate?} vägmall till alla sidor i appen.

using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace SampleApp.Conventions;

public class GlobalTemplatePageRouteModelConvention : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        var selectorCount = model.Selectors.Count;
        for (var i = 0; i < selectorCount; i++)
        {
            var selector = model.Selectors[i];
            model.Selectors.Add(new SelectorModel
            {
                AttributeRouteModel = new AttributeRouteModel
                {
                    Order = 1,
                    Template = AttributeRouteModel.CombineTemplates(
                        selector.AttributeRouteModel!.Template, 
                        "{globalTemplate?}"),
                }
            });
        }
    }
}

I koden ovan:

Razor Sidalternativ, som att lägga till Conventions, ingår när Razor Sidor läggs till i tjänstsamlingen. Ett exempel finns i exempelappen.

using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.EntityFrameworkCore;
using SampleApp.Conventions;
using SampleApp.Data;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<AppDbContext>(options =>
                                   options.UseInMemoryDatabase("InMemoryDb"));

builder.Services.AddRazorPages(options =>
   {
       options.Conventions.Add(new GlobalTemplatePageRouteModelConvention());

       options.Conventions.AddFolderRouteModelConvention("/OtherPages", model =>
       {
           var selectorCount = model.Selectors.Count;
           for (var i = 0; i < selectorCount; i++)
           {
               var selector = model.Selectors[i];
               model.Selectors.Add(new SelectorModel
               {
                   AttributeRouteModel = new AttributeRouteModel
                   {
                       Order = 2,
                       Template = AttributeRouteModel.CombineTemplates(
                           selector.AttributeRouteModel!.Template,
                           "{otherPagesTemplate?}"),
                   }
               });
           }
       });

       options.Conventions.AddPageRouteModelConvention("/About", model =>
       {
           var selectorCount = model.Selectors.Count;
           for (var i = 0; i < selectorCount; i++)
           {
               var selector = model.Selectors[i];
               model.Selectors.Add(new SelectorModel
               {
                   AttributeRouteModel = new AttributeRouteModel
                   {
                       Order = 2,
                       Template = AttributeRouteModel.CombineTemplates(
                           selector.AttributeRouteModel!.Template,
                           "{aboutTemplate?}"),
                   }
               });
           }
       });

   });

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthorization();
app.MapRazorPages();
app.Run();

Överväg klassen GlobalTemplatePageRouteModelConvention :

using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace SampleApp.Conventions;

public class GlobalTemplatePageRouteModelConvention : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        var selectorCount = model.Selectors.Count;
        for (var i = 0; i < selectorCount; i++)
        {
            var selector = model.Selectors[i];
            model.Selectors.Add(new SelectorModel
            {
                AttributeRouteModel = new AttributeRouteModel
                {
                    Order = 1,
                    Template = AttributeRouteModel.CombineTemplates(
                        selector.AttributeRouteModel!.Template, 
                        "{globalTemplate?}"),
                }
            });
        }
    }
}

Egenskapen Order för AttributeRouteModel är inställd på 1. Detta säkerställer följande vägmatchningsbeteende i exempelappen:

  • En vägmall för TheContactPage/{text?} läggs till senare i det här avsnittet. Rutten Contact Page har standardordningen null (Order = 0), så den matchar före ruttmallen {globalTemplate?} som har Order = 1.

  • Routningsmallen {aboutTemplate?} visas i föregående kod. Mallen {aboutTemplate?} får en Order av 2. När sidan Om begärs på /About/RouteDataValue läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["aboutTemplate"] (Order = 2) på grund av att egenskapen Order har angetts.

  • Vägmallen {otherPagesTemplate?} visas i föregående kod. Mallen {otherPagesTemplate?} får en Order av 2. När en sida i mappen Pages/OtherPages begärs med en vägparameter:

  • Till exempel: /OtherPages/Page1/xyz

  • Värdet för routningsdata "xyz" läses in i RouteData.Values["globalTemplate"] (Order = 1).

  • RouteData.Values["otherPagesTemplate"] med (Order = 2) har inte lästs in på grund av att egenskapen Order2 har ett högre värde.

När det är möjligt ska du inte ange Order. När Order inte har angetts är standardvärdet Order = 0. Förlita dig på routning för att välja rätt väg i stället för egenskapen Order .

Begär exemplets About sida på localhost:{port}/About/GlobalRouteValue och inspektera resultatet:

Om oss-sidan begärs med ett routsegment av GlobalRouteValue. Den renderade sidan visar att värdet för routningsdatan fångas upp i OnGet-metoden på sidan.

Exempelappen använder NuGet-paketet Rick.Docs.Samples.RouteInfo för att visa routningsinformation i loggningsutdata. Med hjälp av localhost:{port}/About/GlobalRouteValuevisar loggaren begäran, Orderoch mallen som används:

info: SampleApp.Pages.AboutModel[0]
       /About/GlobalRouteValue   Order = 1 Template = About/{globalTemplate?}

Lägga till en appmodellkonvention på alla sidor

Använd Conventions för att skapa och lägga till en IPageApplicationModelConvention i samlingen av IPageConvention-instanser som tillämpas under modelleringsprocessen för sidappen.

Exempelappen innehåller en AddHeaderAttribute klass för att demonstrera detta och andra konventioner senare i ämnet. Klasskonstruktorn accepterar en name sträng och en values strängmatris. Dessa värden används i metoden OnResultExecuting för att ange ett svarshuvud. Den fullständiga klassen visas i avsnittet Sidmodellåtgärdskonventioner senare i ämnet.

Exempelappen AddHeaderAttribute använder klassen för att lägga till en rubrik, GlobalHeader, till alla sidor i appen:

public class GlobalHeaderPageApplicationModelConvention 
    : IPageApplicationModelConvention
{
    public void Apply(PageApplicationModel model)
    {
        model.Filters.Add(new AddHeaderAttribute(
            "GlobalHeader", new string[] { "Global Header Value" }));
    }
}

Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseInMemoryDatabase("InMemoryDb"));

builder.Services.AddRazorPages(options =>
   {
       options.Conventions.Add(new GlobalTemplatePageRouteModelConvention());

       options.Conventions.Add(new GlobalHeaderPageApplicationModelConvention());

Begär exemplets Om-sida på localhost:{port}/About och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan Om visar att GlobalHeader har lagts till.

Lägga till en modellkonvention för hanterare på alla sidor

Använd Conventions för att skapa och lägga till en IPageHandlerModelConvention i samlingen av IPageConvention instanser som tillämpas under sidhanterarmodellens konstruktion.

public class GlobalPageHandlerModelConvention
    : IPageHandlerModelConvention
{
    public void Apply(PageHandlerModel model)
    {
        // Access the PageHandlerModel
    }
}

Åtgärdskonventioner för sidväg

Standardleverantören för routningsmodellen som härleds från IPageRouteModelProvider anropar konventioner som är utformade för att tillhandahålla utökningspunkter för att konfigurera sidvägar.

Modellkonvention för mappväg

Använd AddFolderRouteModelConvention för att skapa och lägga till en IPageRouteModelConvention som anropar en åtgärd för PageRouteModel alla sidor under den angivna mappen.

Exempelappen använder AddFolderRouteModelConvention för att lägga till en {otherPagesTemplate?} vägmall på sidorna i mappen OtherPages :

options.Conventions.AddFolderRouteModelConvention("/OtherPages", model =>
{
    var selectorCount = model.Selectors.Count;
    for (var i = 0; i < selectorCount; i++)
    {
        var selector = model.Selectors[i];
        model.Selectors.Add(new SelectorModel
        {
            AttributeRouteModel = new AttributeRouteModel
            {
                Order = 2,
                Template = AttributeRouteModel.CombineTemplates(
                    selector.AttributeRouteModel!.Template,
                    "{otherPagesTemplate?}"),
            }
        });
    }
});

Egenskapen Order för AttributeRouteModel är inställd på 2. Detta säkerställer att mallen för {globalTemplate?} (som tidigare i ämnet angavs till 1) prioriteras för den första vägdatavärdepositionen när ett enda vägvärde anges. Om en sida i mappen Pages/OtherPages begärs med ett vägparametervärde (till exempel /OtherPages/Page1/RouteDataValue), läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["otherPagesTemplate"] (Order = 2) på grund av att egenskapen har angetts Order .

Ange inte Order där det är möjligt, vilket resulterar i Order = 0. Förlita dig på routning för att välja rätt väg.

Begär exemplets sida 1 på localhost:5000/OtherPages/Page1/GlobalRouteValue/OtherPagesRouteValue och kontrollera resultatet:

Page1 i mappen OtherPages begärs med ett routningssegment med GlobalRouteValue och OtherPagesRouteValue. Den renderade sidan visar att vägdatavärdena samlas in i onget-metoden på sidan.

Modellkonvention för sidväg

Använd AddPageRouteModelConvention för att skapa och lägga till en IPageRouteModelConvention som anropar en åtgärd på PageRouteModel sidan med det angivna namnet.

Exempelappen använder AddPageRouteModelConvention för att lägga till en {aboutTemplate?} vägmall på sidan Om:

options.Conventions.AddPageRouteModelConvention("/About", model =>
{
    var selectorCount = model.Selectors.Count;
    for (var i = 0; i < selectorCount; i++)
    {
        var selector = model.Selectors[i];
        model.Selectors.Add(new SelectorModel
        {
            AttributeRouteModel = new AttributeRouteModel
            {
                Order = 2,
                Template = AttributeRouteModel.CombineTemplates(
                    selector.AttributeRouteModel!.Template,
                    "{aboutTemplate?}"),
            }
        });
    }
});

Egenskapen Order för AttributeRouteModel är inställd på 2. Detta säkerställer att mallen för {globalTemplate?} (som tidigare i ämnet angavs till 1) prioriteras för den första vägdatavärdepositionen när ett enda vägvärde anges. Om sidan Om begärs med ett vägparametervärde vid /About/RouteDataValue, läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["aboutTemplate"] (Order = 2) på grund av att egenskapen Order har angetts.

Ange inte Order där det är möjligt, vilket resulterar i Order = 0. Förlita dig på routning för att välja rätt väg.

Begär exemplets Om-sida på localhost:{port}/About/GlobalRouteValue/AboutRouteValue och inspektera resultatet:

Om sidan efterfrågas med routsegment för GlobalRouteValue och AboutRouteValue. Den renderade sidan visar att ruttens datavärden samlas in av OnGet-metoden på sidan.

Loggningsutdata visar:

info: SampleApp.Pages.AboutModel[0]
       /About/GlobalRouteValue/AboutRouteValue   Order = 2 Template = About/{globalTemplate?}/{aboutTemplate?}

Använda en parametertransformator för att anpassa sidvägar

Se Parametertransformatorer.

Konfigurera en sidväg

Använd AddPageRoute för att konfigurera en väg till en sida på den angivna sidsökvägen. Genererade länkar till sidan använder den angivna vägen. AddPageRoute använder AddPageRouteModelConvention för att etablera rutten.

Exempelappen skapar en väg till /TheContactPage för sidan ContactRazor :

options.Conventions.AddPageRoute("/Contact", "TheContactPage/{text?}");

Sidan Contact kan också nås på /Contact1' via dess standardväg.

Exempelappens anpassade väg till Contact sidan tillåter ett valfritt text vägsegment ({text?}). Sidan innehåller även det här valfria segmentet i direktivet @page om besökaren kommer åt sidan på vägen /Contact :

@page "{text?}"
@model ContactModel
@{
    ViewData["Title"] = "Contact";
}

<h1>@ViewData["Title"]</h1>
<h2>@Model.Message</h2>

<address>
    One Microsoft Way<br>
    Redmond, WA 98052-6399<br>
    <abbr title="Phone">P:</abbr>
    425.555.0100
</address>

<address>
    <strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br>
    <strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
</address>

<p>@Model.RouteDataTextTemplateValue</p>

Observera att URL:en som genererades för länken Kontakt på den renderade sidan återspeglar den uppdaterade vägen:

Kontaktlänk för exempelapp i navigeringsfältet

Om du inspekterar kontaktlänken i den renderade HTML-koden anges href till

Besök sidan Contact på antingen dess vanliga väg, /Contact, eller den anpassade vägen, /TheContactPage. Om du anger ytterligare text ett vägsegment visar sidan det HTML-kodade segment som du anger:

Edge-webbläsarexempel på att ange ett valfritt

Åtgärdskonventioner för sidmodell

Standardprovidern för sidmodeller som implementerar IPageApplicationModelProvider anropar konventioner som är utformade för att tillhandahålla utökningspunkter för att konfigurera sidmodeller. Dessa konventioner är användbara när du skapar och ändrar scenarier för sididentifiering och bearbetning.

För exemplen i det här avsnittet använder exempelappen en AddHeaderAttribute klass, som är en ResultFilterAttribute, som tillämpar ett svarshuvud:

public class AddHeaderAttribute : ResultFilterAttribute
{
    private readonly string _name;
    private readonly string[] _values;

    public AddHeaderAttribute(string name, string[] values)
    {
        _name = name;
        _values = values;
    }

    public override void OnResultExecuting(ResultExecutingContext context)
    {
        context.HttpContext.Response.Headers.Add(_name, _values);
        base.OnResultExecuting(context);
    }
}

Med hjälp av konventioner visar exemplet hur du tillämpar attributet på alla sidor i en mapp och på en enda sida.

Modellkonvention för mappapp

Använd AddFolderApplicationModelConvention för att skapa och lägga till en IPageApplicationModelConvention som anropar en åtgärd på PageApplicationModel instanser för alla sidor under den angivna mappen.

Exemplet visar hur du använder AddFolderApplicationModelConvention genom att lägga till en rubrik, OtherPagesHeader, på sidorna i mappen OtherPages i appen:

options.Conventions.AddFolderApplicationModelConvention("/OtherPages", model =>
{
    model.Filters.Add(new AddHeaderAttribute(
        "OtherPagesHeader", new string[] { "OtherPages Header Value" }));
});

Begär exemplets sida 1 på localhost:5000/OtherPages/Page1 och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan OtherPages/Page1 visar att OtherPagesHeader har lagts till.

Modellkonvention för sidapp

Använd AddPageApplicationModelConvention för att skapa och lägga till en IPageApplicationModelConvention som anropar en åtgärd på PageApplicationModel sidan med det angivna namnet.

Exemplet visar hur du använder AddPageApplicationModelConvention genom att lägga till en rubrik, AboutHeader, på sidan Om:

options.Conventions.AddPageApplicationModelConvention("/About", model =>
{
    model.Filters.Add(new AddHeaderAttribute(
        "AboutHeader", new string[] { "About Header Value" }));
});

Begär exemplets Om-sida på localhost:5000/About och granska rubrikerna för att visa resultatet:

Responshuvuden på sidan Om visar att OmHeader har lagts till.

Konfigurera ett filter

ConfigureFilter konfigurerar det angivna filtret att gälla. Du kan implementera en filterklass, men exempelappen visar hur du implementerar ett filter i ett lambda-uttryck, som implementeras bakom kulisserna som en fabrik som returnerar ett filter:

options.Conventions.ConfigureFilter(model =>
{
    if (model.RelativePath.Contains("OtherPages/Page2"))
    {
        return new AddHeaderAttribute(
            "OtherPagesPage2Header",
            new string[] { "OtherPages/Page2 Header Value" });
    }
    return new EmptyFilter();
});

Sidappsmodellen används för att kontrollera den relativa sökvägen för segment som leder till sidan Page2 i mappen OtherPages . Om villkoret godkänns läggs en rubrik till. Om inte, EmptyFilter tillämpas.

EmptyFilter är ett åtgärdsfilter. Eftersom Åtgärdsfilter ignoreras av Razor Sidor EmptyFilter har det ingen effekt som avsett om sökvägen inte innehåller OtherPages/Page2.

Begär exemplets sida 2 på localhost:5000/OtherPages/Page2 och granska rubrikerna för att visa resultatet:

OtherPagesPage2Header läggs till i svaret för Page2.

Konfigurera en filterfabrik

ConfigureFilter konfigurerar den angivna fabriken för att tillämpa filter på alla Razor sidor.

Exempelappen innehåller ett exempel på hur du använder en filterfabrik genom att lägga till en rubrik, FilterFactoryHeader, med två värden på appens sidor:

options.Conventions.ConfigureFilter(new AddHeaderWithFactory());

AddHeaderWithFactory.cs:

public class AddHeaderWithFactory : IFilterFactory
{
    // Implement IFilterFactory
    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        return new AddHeaderFilter();
    }

    private class AddHeaderFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            context.HttpContext.Response.Headers.Add(
                "FilterFactoryHeader", 
                new string[] 
                { 
                    "Filter Factory Header Value 1",
                    "Filter Factory Header Value 2"
                });
        }

        public void OnResultExecuted(ResultExecutedContext context)
        {
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Begär exemplets Om-sida på localhost:5000/About och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan Om visar att två FilterFactoryHeader-huvuden har lagts till.

MVC-filter och sidfiltret (IPageFilter)

MVC-actionfilter ignoreras av Sidor, eftersom Razor Sidor använder hantermethoder. Du kan använda andra typer av MVC-filter: auktorisering, undantag, resurs och resultat. Mer information finns i avsnittet Filter .

Sidfiltret (IPageFilter) är ett filter som gäller för Razor Sidor. Mer information finns i Filtermetoder för Razor Pages.

Ytterligare resurser

Lär dig hur du använder providerkonventioner för sidväg och appmodell för att styra sidroutning, identifiering och bearbetning i Razor Pages-appar.

När du behöver konfigurera anpassade sidvägar för enskilda sidor konfigurerar du routning till sidor med AddPageRoute-konventionen som beskrivs senare i det här avsnittet.

Om du vill ange en sidväg, lägga till vägsegment eller lägga till parametrar i en väg använder du sidans @page direktiv. Mer information finns i Anpassade vägar.

Det finns reserverade ord som inte kan användas som routningssegment eller parameternamn. Mer information finns i Routning: Reserverade routningsnamn.

Visa eller ladda ned exempelkod (hur du laddar ned)

Scenario Exemplet visar ...
Modellkonventioner

Conventions.Add
  • IPageRouteModelConvention
  • IPageApplicationModelConvention
  • IPageHandlerModelConvention
Lägg till en routningsmall och rubrik på en apps sidor.
Routningskonventioner för sidor
  • AddFolderRouteModelConvention
  • AddPageRouteModelConvention
  • AddPageRoute
Lägg till en vägmall till sidor i en mapp och på en enda sida.
Åtgärdskonventioner för sidmodell
  • AddFolderApplicationModelConvention
  • AddPageApplicationModelConvention
  • ConfigureFilter (filterklass, lambda-uttryck eller filterfabrik)
Lägg till ett sidhuvud på sidor i en mapp, lägg till en rubrik på en enda sida och konfigurera en filterfabrik för att lägga till en rubrik på en apps sidor.

Razor Sidkonventioner konfigureras med hjälp av en AddRazorPages överbelastning som konfigurerar RazorPagesOptions i Startup.ConfigureServices. Följande konventionsexempel beskrivs senare i det här avsnittet:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages(options =>
    {
        options.Conventions.Add( ... );
        options.Conventions.AddFolderRouteModelConvention(
            "/OtherPages", model => { ... });
        options.Conventions.AddPageRouteModelConvention(
            "/About", model => { ... });
        options.Conventions.AddPageRoute(
            "/Contact", "TheContactPage/{text?}");
        options.Conventions.AddFolderApplicationModelConvention(
            "/OtherPages", model => { ... });
        options.Conventions.AddPageApplicationModelConvention(
            "/About", model => { ... });
        options.Conventions.ConfigureFilter(model => { ... });
        options.Conventions.ConfigureFilter( ... );
    });
}

Routningsordning

Rutter anger en Order för bearbetning (rutmatchning).

Order Behavior
-1 Vägen bearbetas innan andra vägar bearbetas.
0 Order har inte angetts (standardvärde). Om du inte tilldelar Order (Order = null) resulterar det i att standardvägen Order sätts till 0 (noll) för bearbetning.
1, 2, … n Anger behandlingsordning för rutt.

Vägbearbetning upprättas enligt konventionen:

  • Vägar bearbetas i sekventiell ordning (-1, 0, 1, 2, ... n).
  • När vägarna har samma Ordermatchas den mest specifika vägen först följt av mindre specifika vägar.
  • När vägar med samma Order och samma antal parametrar matchar en url för begäran bearbetas vägar i den ordning som de läggs till i PageConventionCollection.

Försök om möjligt att undvika att förlita dig på en etablerad ruttbehandlingsordning. I allmänhet väljer routning rätt väg med URL-matchning. Om du måste ange routningsegenskaper Order för att dirigera begäranden korrekt är appens routningsschema förmodligen förvirrande för klienter och bräckligt att underhålla. Försök att förenkla appens routningsschema. Exempelappen kräver en explicit vägbearbetningsordning för att demonstrera flera routningsscenarier med hjälp av en enda app. Du bör dock försöka undvika att ange vägen Order i produktionsappar.

Razor Sidroutning och MVC-styrenhetsroutning delar en implementering. Information om routningsordning i MVC-ämnena finns i Routning till kontrollantåtgärder: Ordna attributvägar.

Modellkonventioner

Lägg till ett ombud för IPageConvention att lägga till modellkonventioner som gäller för Razor Sidor.

Lägga till en routningsmodellkonvention på alla sidor

Använd Conventions för att skapa och lägga till en IPageRouteModelConvention i samlingen av IPageConvention instanser som tillämpas under konfigurationen av sidans ruttmodell.

Exempelappen lägger till en {globalTemplate?} routningsmall på alla sidor i appen:

public class GlobalTemplatePageRouteModelConvention 
    : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        var selectorCount = model.Selectors.Count;
        for (var i = 0; i < selectorCount; i++)
        {
            var selector = model.Selectors[i];
            model.Selectors.Add(new SelectorModel
            {
                AttributeRouteModel = new AttributeRouteModel
                {
                    Order = 1,
                    Template = AttributeRouteModel.CombineTemplates(
                        selector.AttributeRouteModel.Template, 
                        "{globalTemplate?}"),
                }
            });
        }
    }
}

Egenskapen Order för AttributeRouteModel är inställd på 1. Detta säkerställer följande vägmatchningsbeteende i exempelappen:

  • En vägmall för TheContactPage/{text?} läggs till senare i ämnet. Kontaktsida-routen har en standardordning av null (Order = 0), så den matchar före ruttemplaten {globalTemplate?}.
  • En {aboutTemplate?} routemall läggs till senare i avsnittet. Mallen {aboutTemplate?} får en Order av 2. När sidan Om begärs på /About/RouteDataValue läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["aboutTemplate"] (Order = 2) på grund av att egenskapen Order har angetts.
  • En {otherPagesTemplate?} routemall läggs till senare i avsnittet. Mallen {otherPagesTemplate?} får en Order av 2. När en sida i mappen Pages/OtherPages begärs med en vägparameter (till exempel /OtherPages/Page1/RouteDataValue), läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["otherPagesTemplate"] (Order = 2) på grund av att egenskapen har angetts Order .

Ange inte Order där det är möjligt, vilket resulterar i Order = 0. Förlita dig på routning för att välja rätt väg.

Razor Sidalternativ, till exempel att lägga till Conventions, läggs till när Razor Sidor läggs till i tjänstsamlingen i Startup.ConfigureServices. Ett exempel finns i exempelappen.

options.Conventions.Add(new GlobalTemplatePageRouteModelConvention());

Begär exemplets Om-sida på localhost:5000/About/GlobalRouteValue och inspektera resultatet:

Om oss-sidan begärs med ett routsegment av GlobalRouteValue. Den renderade sidan visar att värdet för routningsdatan fångas upp i OnGet-metoden på sidan.

Lägga till en appmodellkonvention på alla sidor

Använd Conventions för att skapa och lägga till en IPageApplicationModelConvention i samlingen av IPageConvention-instanser som tillämpas under modelleringsprocessen för sidappen.

Exempelappen innehåller en AddHeaderAttribute klass för att demonstrera detta och andra konventioner senare i ämnet. Klasskonstruktorn accepterar en name sträng och en values strängmatris. Dessa värden används i metoden OnResultExecuting för att ange ett svarshuvud. Den fullständiga klassen visas i avsnittet Sidmodellåtgärdskonventioner senare i ämnet.

Exempelappen AddHeaderAttribute använder klassen för att lägga till en rubrik, GlobalHeader, till alla sidor i appen:

public class GlobalHeaderPageApplicationModelConvention 
    : IPageApplicationModelConvention
{
    public void Apply(PageApplicationModel model)
    {
        model.Filters.Add(new AddHeaderAttribute(
            "GlobalHeader", new string[] { "Global Header Value" }));
    }
}

Startup.cs:

options.Conventions.Add(new GlobalHeaderPageApplicationModelConvention());

Begär exemplets Om-sida på localhost:5000/About och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan Om visar att GlobalHeader har lagts till.

Lägga till en modellkonvention för hanterare på alla sidor

Använd Conventions för att skapa och lägga till en IPageHandlerModelConvention i samlingen av IPageConvention instanser som tillämpas under sidhanterarmodellens konstruktion.

public class GlobalPageHandlerModelConvention
    : IPageHandlerModelConvention
{
    public void Apply(PageHandlerModel model)
    {
        // Access the PageHandlerModel
    }
}

Startup.cs:

options.Conventions.Add(new GlobalPageHandlerModelConvention());

Åtgärdskonventioner för sidväg

Standardleverantören för routningsmodellen som härleds från IPageRouteModelProvider anropar konventioner som är utformade för att tillhandahålla utökningspunkter för att konfigurera sidvägar.

Modellkonvention för mappväg

Använd AddFolderRouteModelConvention för att skapa och lägga till en IPageRouteModelConvention som anropar en åtgärd för PageRouteModel alla sidor under den angivna mappen.

Exempelappen använder AddFolderRouteModelConvention för att lägga till en {otherPagesTemplate?} vägmall på sidorna i mappen OtherPages :

options.Conventions.AddFolderRouteModelConvention("/OtherPages", model =>
{
    var selectorCount = model.Selectors.Count;
    for (var i = 0; i < selectorCount; i++)
    {
        var selector = model.Selectors[i];
        model.Selectors.Add(new SelectorModel
        {
            AttributeRouteModel = new AttributeRouteModel
            {
                Order = 2,
                Template = AttributeRouteModel.CombineTemplates(
                    selector.AttributeRouteModel.Template, 
                    "{otherPagesTemplate?}"),
            }
        });
    }
});

Egenskapen Order för AttributeRouteModel är inställd på 2. Detta säkerställer att mallen för {globalTemplate?} (som tidigare i ämnet angavs till 1) prioriteras för den första vägdatavärdepositionen när ett enda vägvärde anges. Om en sida i mappen Pages/OtherPages begärs med ett vägparametervärde (till exempel /OtherPages/Page1/RouteDataValue), läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["otherPagesTemplate"] (Order = 2) på grund av att egenskapen har angetts Order .

Ange inte Order där det är möjligt, vilket resulterar i Order = 0. Förlita dig på routning för att välja rätt väg.

Begär exemplets sida 1 på localhost:5000/OtherPages/Page1/GlobalRouteValue/OtherPagesRouteValue och kontrollera resultatet:

Page1 i mappen OtherPages begärs med ett routningssegment med GlobalRouteValue och OtherPagesRouteValue. Den renderade sidan visar att vägdatavärdena samlas in i onget-metoden på sidan.

Modellkonvention för sidväg

Använd AddPageRouteModelConvention för att skapa och lägga till en IPageRouteModelConvention som anropar en åtgärd på PageRouteModel sidan med det angivna namnet.

Exempelappen använder AddPageRouteModelConvention för att lägga till en {aboutTemplate?} vägmall på sidan Om:

options.Conventions.AddPageRouteModelConvention("/About", model =>
{
    var selectorCount = model.Selectors.Count;
    for (var i = 0; i < selectorCount; i++)
    {
        var selector = model.Selectors[i];
        model.Selectors.Add(new SelectorModel
        {
            AttributeRouteModel = new AttributeRouteModel
            {
                Order = 2,
                Template = AttributeRouteModel.CombineTemplates(
                    selector.AttributeRouteModel.Template, 
                    "{aboutTemplate?}"),
            }
        });
    }
});

Egenskapen Order för AttributeRouteModel är inställd på 2. Detta säkerställer att mallen för {globalTemplate?} (som tidigare i ämnet angavs till 1) prioriteras för den första vägdatavärdepositionen när ett enda vägvärde anges. Om sidan Om begärs med ett vägparametervärde vid /About/RouteDataValue, läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["aboutTemplate"] (Order = 2) på grund av att egenskapen Order har angetts.

Ange inte Order där det är möjligt, vilket resulterar i Order = 0. Förlita dig på routning för att välja rätt väg.

Begär exemplets Om-sida på localhost:5000/About/GlobalRouteValue/AboutRouteValue och inspektera resultatet:

Om sidan efterfrågas med routsegment för GlobalRouteValue och AboutRouteValue. Den renderade sidan visar att ruttens datavärden samlas in av OnGet-metoden på sidan.

Använda en parametertransformator för att anpassa sidvägar

Sidvägar som genereras av ASP.NET Core kan anpassas med hjälp av en parametertransformator. En parametertransformator implementerar IOutboundParameterTransformer och transformerar värdet för parametrar. Till exempel ändrar en anpassad SlugifyParameterTransformer parametertransformator SubscriptionManagement vägvärdet till subscription-management.

Modellen PageRouteTransformerConvention för sidväg tillämpar en parametertransformator för mapp- och filnamnssegmenten för automatiskt genererade sidvägar i en app. Till exempel Razor skulle pages-filen på /Pages/SubscriptionManagement/ViewAll.cshtml få sin väg omskriven från /SubscriptionManagement/ViewAll till /subscription-management/view-all.

PageRouteTransformerConvention transformerar endast de automatiskt genererade segmenten för en sidväg som kommer från Razor mappen Pages och filnamnet. Det transformerar inte routningssegment som lagts till med @page direktivet. Konventionen transformerar inte heller vägar som läggs till av AddPageRoute.

PageRouteTransformerConvention Är registrerad som ett alternativ i Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages(options =>
    {
        options.Conventions.Add(
            new PageRouteTransformerConvention(
                new SlugifyParameterTransformer()));
    });
}
public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
    public string TransformOutbound(object value)
    {
        if (value == null) { return null; }

        return Regex.Replace(value.ToString(),
                             "([a-z])([A-Z])",
                             "$1-$2",
                             RegexOptions.CultureInvariant,
                             TimeSpan.FromMilliseconds(100)).ToLowerInvariant();
    }
}

Warning

När du använder System.Text.RegularExpressions för att bearbeta ej betrodda indata skickar du en timeout. En obehörig användare kan ange indata för att RegularExpressions orsaka en Denial-of-Service-attack. ASP.NET Core Frameworks API som använder RegularExpressions har en timeout.

Konfigurera en sidväg

Använd AddPageRoute för att konfigurera en väg till en sida på den angivna sidsökvägen. Genererade länkar till sidan använder din angivna väg. AddPageRoute använder AddPageRouteModelConvention för att etablera rutten.

Exempelappen skapar en väg till /TheContactPage för Contact.cshtml:

options.Conventions.AddPageRoute("/Contact", "TheContactPage/{text?}");

Sidan Kontakt kan också nås via dess standardväg på /Contact.

Exempelappens anpassade väg till sidan Kontakt tillåter ett valfritt routningssegment text ({text?}). Sidan innehåller även det här valfria segmentet i direktivet @page om besökaren kommer åt sidan på vägen /Contact :

@page "{text?}"
@model ContactModel
@{
    ViewData["Title"] = "Contact";
}

<h1>@ViewData["Title"]</h1>
<h2>@Model.Message</h2>

<address>
    One Microsoft Way<br>
    Redmond, WA 98052-6399<br>
    <abbr title="Phone">P:</abbr>
    425.555.0100
</address>

<address>
    <strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br>
    <strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
</address>

<p>@Model.RouteDataTextTemplateValue</p>

Observera att URL:en som genererades för länken Kontakt på den renderade sidan återspeglar den uppdaterade vägen:

Kontaktlänk för exempelapp i navigeringsfältet

Om du inspekterar kontaktlänken i den renderade HTML-koden anges href till

Besök sidan Kontakt på den vanliga vägen, /Contacteller den anpassade vägen. /TheContactPage Om du anger ytterligare text ett vägsegment visar sidan det HTML-kodade segment som du anger:

Edge-webbläsarexempel på att ange ett valfritt

Åtgärdskonventioner för sidmodell

Standardprovidern för sidmodeller som implementerar IPageApplicationModelProvider anropar konventioner som är utformade för att tillhandahålla utökningspunkter för att konfigurera sidmodeller. Dessa konventioner är användbara när du skapar och ändrar scenarier för sididentifiering och bearbetning.

För exemplen i det här avsnittet använder exempelappen en AddHeaderAttribute klass, som är en ResultFilterAttribute, som tillämpar ett svarshuvud:

public class AddHeaderAttribute : ResultFilterAttribute
{
    private readonly string _name;
    private readonly string[] _values;

    public AddHeaderAttribute(string name, string[] values)
    {
        _name = name;
        _values = values;
    }

    public override void OnResultExecuting(ResultExecutingContext context)
    {
        context.HttpContext.Response.Headers.Add(_name, _values);
        base.OnResultExecuting(context);
    }
}

Med hjälp av konventioner visar exemplet hur du tillämpar attributet på alla sidor i en mapp och på en enda sida.

Modellkonvention för mappapp

Använd AddFolderApplicationModelConvention för att skapa och lägga till en IPageApplicationModelConvention som anropar en åtgärd på PageApplicationModel instanser för alla sidor under den angivna mappen.

Exemplet visar hur du använder AddFolderApplicationModelConvention genom att lägga till en rubrik, OtherPagesHeader, på sidorna i mappen OtherPages i appen:

options.Conventions.AddFolderApplicationModelConvention("/OtherPages", model =>
{
    model.Filters.Add(new AddHeaderAttribute(
        "OtherPagesHeader", new string[] { "OtherPages Header Value" }));
});

Begär exemplets sida 1 på localhost:5000/OtherPages/Page1 och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan OtherPages/Page1 visar att OtherPagesHeader har lagts till.

Modellkonvention för sidapp

Använd AddPageApplicationModelConvention för att skapa och lägga till en IPageApplicationModelConvention som anropar en åtgärd på PageApplicationModel sidan med det angivna namnet.

Exemplet visar hur du använder AddPageApplicationModelConvention genom att lägga till en rubrik, AboutHeader, på sidan Om:

options.Conventions.AddPageApplicationModelConvention("/About", model =>
{
    model.Filters.Add(new AddHeaderAttribute(
        "AboutHeader", new string[] { "About Header Value" }));
});

Begär exemplets Om-sida på localhost:5000/About och granska rubrikerna för att visa resultatet:

Responshuvuden på sidan Om visar att OmHeader har lagts till.

Konfigurera ett filter

ConfigureFilter konfigurerar det angivna filtret att gälla. Du kan implementera en filterklass, men exempelappen visar hur du implementerar ett filter i ett lambda-uttryck, som implementeras bakom kulisserna som en fabrik som returnerar ett filter:

options.Conventions.ConfigureFilter(model =>
{
    if (model.RelativePath.Contains("OtherPages/Page2"))
    {
        return new AddHeaderAttribute(
            "OtherPagesPage2Header", 
            new string[] { "OtherPages/Page2 Header Value" });
    }
    return new EmptyFilter();
});

Sidappsmodellen används för att kontrollera den relativa sökvägen för segment som leder till sidan Page2 i mappen OtherPages . Om villkoret godkänns läggs en rubrik till. Om inte, EmptyFilter tillämpas.

EmptyFilter är ett åtgärdsfilter. Eftersom Åtgärdsfilter ignoreras av Razor Sidor EmptyFilter har det ingen effekt som avsett om sökvägen inte innehåller OtherPages/Page2.

Begär exemplets sida 2 på localhost:5000/OtherPages/Page2 och granska rubrikerna för att visa resultatet:

OtherPagesPage2Header läggs till i svaret för Page2.

Konfigurera en filterfabrik

ConfigureFilter konfigurerar den angivna fabriken för att tillämpa filter på alla Razor sidor.

Exempelappen innehåller ett exempel på hur du använder en filterfabrik genom att lägga till en rubrik, FilterFactoryHeader, med två värden på appens sidor:

options.Conventions.ConfigureFilter(new AddHeaderWithFactory());

AddHeaderWithFactory.cs:

public class AddHeaderWithFactory : IFilterFactory
{
    // Implement IFilterFactory
    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        return new AddHeaderFilter();
    }

    private class AddHeaderFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            context.HttpContext.Response.Headers.Add(
                "FilterFactoryHeader", 
                new string[] 
                { 
                    "Filter Factory Header Value 1",
                    "Filter Factory Header Value 2"
                });
        }

        public void OnResultExecuted(ResultExecutedContext context)
        {
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Begär exemplets Om-sida på localhost:5000/About och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan Om visar att två FilterFactoryHeader-huvuden har lagts till.

MVC-filter och sidfiltret (IPageFilter)

MVC-actionfilter ignoreras av Sidor, eftersom Razor Sidor använder hantermethoder. Du kan använda andra typer av MVC-filter: auktorisering, undantag, resurs och resultat. Mer information finns i avsnittet Filter .

Sidfiltret (IPageFilter) är ett filter som gäller för Razor Sidor. Mer information finns i Filtermetoder för Razor Pages.

Ytterligare resurser

Lär dig hur du använder providerkonventioner för sidväg och appmodell för att styra sidroutning, identifiering och bearbetning i Razor Pages-appar.

När du behöver konfigurera anpassade sidvägar för enskilda sidor konfigurerar du routning till sidor med AddPageRoute-konventionen som beskrivs senare i det här avsnittet.

Om du vill ange en sidväg, lägga till vägsegment eller lägga till parametrar i en väg använder du sidans @page direktiv. Mer information finns i Anpassade vägar.

Det finns reserverade ord som inte kan användas som routningssegment eller parameternamn. Mer information finns i Routning: Reserverade routningsnamn.

Visa eller ladda ned exempelkod (hur du laddar ned)

Scenario Exemplet visar ...
Modellkonventioner

Conventions.Add
  • IPageRouteModelConvention
  • IPageApplicationModelConvention
  • IPageHandlerModelConvention
Lägg till en routningsmall och rubrik på en apps sidor.
Routningskonventioner för sidor
  • AddFolderRouteModelConvention
  • AddPageRouteModelConvention
  • AddPageRoute
Lägg till en vägmall till sidor i en mapp och på en enda sida.
Åtgärdskonventioner för sidmodell
  • AddFolderApplicationModelConvention
  • AddPageApplicationModelConvention
  • ConfigureFilter (filterklass, lambda-uttryck eller filterfabrik)
Lägg till ett sidhuvud på sidor i en mapp, lägg till en rubrik på en enda sida och konfigurera en filterfabrik för att lägga till en rubrik på en apps sidor.

Razor Sidkonventioner läggs till och konfigureras genom AddRazorPagesOptions tilläggsmetoden till AddMvc i tjänstesamlingen i Startup klassen. Följande konventionsexempel beskrivs senare i det här avsnittet:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.Add( ... );
            options.Conventions.AddFolderRouteModelConvention(
                "/OtherPages", model => { ... });
            options.Conventions.AddPageRouteModelConvention(
                "/About", model => { ... });
            options.Conventions.AddPageRoute(
                "/Contact", "TheContactPage/{text?}");
            options.Conventions.AddFolderApplicationModelConvention(
                "/OtherPages", model => { ... });
            options.Conventions.AddPageApplicationModelConvention(
                "/About", model => { ... });
            options.Conventions.ConfigureFilter(model => { ... });
            options.Conventions.ConfigureFilter( ... );
        });
}

Routningsordning

Rutter anger en Order för bearbetning (rutmatchning).

Order Behavior
-1 Vägen bearbetas innan andra vägar bearbetas.
0 Order har inte angetts (standardvärde). Om du inte tilldelar Order (Order = null) resulterar det i att standardvägen Order sätts till 0 (noll) för bearbetning.
1, 2, … n Anger behandlingsordning för rutt.

Vägbearbetning upprättas enligt konventionen:

  • Vägar bearbetas i sekventiell ordning (-1, 0, 1, 2, ... n).
  • När vägarna har samma Ordermatchas den mest specifika vägen först följt av mindre specifika vägar.
  • När vägar med samma Order och samma antal parametrar matchar en url för begäran bearbetas vägar i den ordning som de läggs till i PageConventionCollection.

Försök om möjligt att undvika att förlita dig på en etablerad ruttbehandlingsordning. I allmänhet väljer routning rätt väg med URL-matchning. Om du måste ange routningsegenskaper Order för att dirigera begäranden korrekt är appens routningsschema förmodligen förvirrande för klienter och bräckligt att underhålla. Försök att förenkla appens routningsschema. Exempelappen kräver en explicit vägbearbetningsordning för att demonstrera flera routningsscenarier med hjälp av en enda app. Du bör dock försöka undvika att ange vägen Order i produktionsappar.

Razor Sidroutning och MVC-styrenhetsroutning delar en implementering. Information om routningsordning i MVC-ämnena finns i Routning till kontrollantåtgärder: Ordna attributvägar.

Modellkonventioner

Lägg till ett ombud för IPageConvention att lägga till modellkonventioner som gäller för Razor Sidor.

Lägga till en routningsmodellkonvention på alla sidor

Använd Conventions för att skapa och lägga till en IPageRouteModelConvention i samlingen av IPageConvention instanser som tillämpas under konfigurationen av sidans ruttmodell.

Exempelappen lägger till en {globalTemplate?} routningsmall på alla sidor i appen:

public class GlobalTemplatePageRouteModelConvention 
    : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        var selectorCount = model.Selectors.Count;
        for (var i = 0; i < selectorCount; i++)
        {
            var selector = model.Selectors[i];
            model.Selectors.Add(new SelectorModel
            {
                AttributeRouteModel = new AttributeRouteModel
                {
                    Order = 1,
                    Template = AttributeRouteModel.CombineTemplates(
                        selector.AttributeRouteModel.Template, 
                        "{globalTemplate?}"),
                }
            });
        }
    }
}

Egenskapen Order för AttributeRouteModel är inställd på 1. Detta säkerställer följande vägmatchningsbeteende i exempelappen:

  • En vägmall för TheContactPage/{text?} läggs till senare i ämnet. Kontaktsida-routen har en standardordning av null (Order = 0), så den matchar före ruttemplaten {globalTemplate?}.
  • En {aboutTemplate?} routemall läggs till senare i avsnittet. Mallen {aboutTemplate?} får en Order av 2. När sidan Om begärs på /About/RouteDataValue läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["aboutTemplate"] (Order = 2) på grund av att egenskapen Order har angetts.
  • En {otherPagesTemplate?} routemall läggs till senare i avsnittet. Mallen {otherPagesTemplate?} får en Order av 2. När en sida i mappen Pages/OtherPages begärs med en vägparameter (till exempel /OtherPages/Page1/RouteDataValue), läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["otherPagesTemplate"] (Order = 2) på grund av att egenskapen har angetts Order .

Ange inte Order där det är möjligt, vilket resulterar i Order = 0. Förlita dig på routning för att välja rätt väg.

Razor Sidalternativ, till exempel att lägga till Conventions, läggs till när MVC läggs till i tjänstsamlingen i Startup.ConfigureServices. Ett exempel finns i exempelappen.

options.Conventions.Add(new GlobalTemplatePageRouteModelConvention());

Begär exemplets Om-sida på localhost:5000/About/GlobalRouteValue och inspektera resultatet:

Om oss-sidan begärs med ett routsegment av GlobalRouteValue. Den renderade sidan visar att värdet för routningsdatan fångas upp i OnGet-metoden på sidan.

Lägga till en appmodellkonvention på alla sidor

Använd Conventions för att skapa och lägga till en IPageApplicationModelConvention i samlingen av IPageConvention-instanser som tillämpas under modelleringsprocessen för sidappen.

Exempelappen innehåller en AddHeaderAttribute klass för att demonstrera detta och andra konventioner senare i ämnet. Klasskonstruktorn accepterar en name sträng och en values strängmatris. Dessa värden används i metoden OnResultExecuting för att ange ett svarshuvud. Den fullständiga klassen visas i avsnittet Sidmodellåtgärdskonventioner senare i ämnet.

Exempelappen AddHeaderAttribute använder klassen för att lägga till en rubrik, GlobalHeader, till alla sidor i appen:

public class GlobalHeaderPageApplicationModelConvention 
    : IPageApplicationModelConvention
{
    public void Apply(PageApplicationModel model)
    {
        model.Filters.Add(new AddHeaderAttribute(
            "GlobalHeader", new string[] { "Global Header Value" }));
    }
}

Startup.cs:

options.Conventions.Add(new GlobalHeaderPageApplicationModelConvention());

Begär exemplets Om-sida på localhost:5000/About och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan Om visar att GlobalHeader har lagts till.

Lägga till en modellkonvention för hanterare på alla sidor

Använd Conventions för att skapa och lägga till en IPageHandlerModelConvention i samlingen av IPageConvention instanser som tillämpas under sidhanterarmodellens konstruktion.

public class GlobalPageHandlerModelConvention
    : IPageHandlerModelConvention
{
    public void Apply(PageHandlerModel model)
    {
        // Access the PageHandlerModel
    }
}

Startup.cs:

options.Conventions.Add(new GlobalPageHandlerModelConvention());

Åtgärdskonventioner för sidväg

Standardleverantören för routningsmodellen som härleds från IPageRouteModelProvider anropar konventioner som är utformade för att tillhandahålla utökningspunkter för att konfigurera sidvägar.

Modellkonvention för mappväg

Använd AddFolderRouteModelConvention för att skapa och lägga till en IPageRouteModelConvention som anropar en åtgärd för PageRouteModel alla sidor under den angivna mappen.

Exempelappen använder AddFolderRouteModelConvention för att lägga till en {otherPagesTemplate?} vägmall på sidorna i mappen OtherPages :

options.Conventions.AddFolderRouteModelConvention("/OtherPages", model =>
{
    var selectorCount = model.Selectors.Count;
    for (var i = 0; i < selectorCount; i++)
    {
        var selector = model.Selectors[i];
        model.Selectors.Add(new SelectorModel
        {
            AttributeRouteModel = new AttributeRouteModel
            {
                Order = 2,
                Template = AttributeRouteModel.CombineTemplates(
                    selector.AttributeRouteModel.Template, 
                    "{otherPagesTemplate?}"),
            }
        });
    }
});

Egenskapen Order för AttributeRouteModel är inställd på 2. Detta säkerställer att mallen för {globalTemplate?} (som tidigare i ämnet angavs till 1) prioriteras för den första vägdatavärdepositionen när ett enda vägvärde anges. Om en sida i mappen Pages/OtherPages begärs med ett vägparametervärde (till exempel /OtherPages/Page1/RouteDataValue), läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["otherPagesTemplate"] (Order = 2) på grund av att egenskapen har angetts Order .

Ange inte Order där det är möjligt, vilket resulterar i Order = 0. Förlita dig på routning för att välja rätt väg.

Begär exemplets sida 1 på localhost:5000/OtherPages/Page1/GlobalRouteValue/OtherPagesRouteValue och kontrollera resultatet:

Page1 i mappen OtherPages begärs med ett routningssegment med GlobalRouteValue och OtherPagesRouteValue. Den renderade sidan visar att vägdatavärdena samlas in i onget-metoden på sidan.

Modellkonvention för sidväg

Använd AddPageRouteModelConvention för att skapa och lägga till en IPageRouteModelConvention som anropar en åtgärd på PageRouteModel sidan med det angivna namnet.

Exempelappen använder AddPageRouteModelConvention för att lägga till en {aboutTemplate?} vägmall på sidan Om:

options.Conventions.AddPageRouteModelConvention("/About", model =>
{
    var selectorCount = model.Selectors.Count;
    for (var i = 0; i < selectorCount; i++)
    {
        var selector = model.Selectors[i];
        model.Selectors.Add(new SelectorModel
        {
            AttributeRouteModel = new AttributeRouteModel
            {
                Order = 2,
                Template = AttributeRouteModel.CombineTemplates(
                    selector.AttributeRouteModel.Template, 
                    "{aboutTemplate?}"),
            }
        });
    }
});

Egenskapen Order för AttributeRouteModel är inställd på 2. Detta säkerställer att mallen för {globalTemplate?} (som tidigare i ämnet angavs till 1) prioriteras för den första vägdatavärdepositionen när ett enda vägvärde anges. Om sidan Om begärs med ett vägparametervärde vid /About/RouteDataValue, läses "RouteDataValue" in i RouteData.Values["globalTemplate"] (Order = 1) och inte RouteData.Values["aboutTemplate"] (Order = 2) på grund av att egenskapen Order har angetts.

Ange inte Order där det är möjligt, vilket resulterar i Order = 0. Förlita dig på routning för att välja rätt väg.

Begär exemplets Om-sida på localhost:5000/About/GlobalRouteValue/AboutRouteValue och inspektera resultatet:

Om sidan efterfrågas med routsegment för GlobalRouteValue och AboutRouteValue. Den renderade sidan visar att ruttens datavärden samlas in av OnGet-metoden på sidan.

Konfigurera en sidväg

Använd AddPageRoute för att konfigurera en väg till en sida på den angivna sidsökvägen. Genererade länkar till sidan använder din angivna väg. AddPageRoute använder AddPageRouteModelConvention för att etablera rutten.

Exempelappen skapar en väg till /TheContactPage för Contact.cshtml:

options.Conventions.AddPageRoute("/Contact", "TheContactPage/{text?}");

Sidan Kontakt kan också nås via dess standardväg på /Contact.

Exempelappens anpassade väg till sidan Kontakt tillåter ett valfritt routningssegment text ({text?}). Sidan innehåller även det här valfria segmentet i direktivet @page om besökaren kommer åt sidan på vägen /Contact :

@page "{text?}"
@model ContactModel
@{
    ViewData["Title"] = "Contact";
}

<h1>@ViewData["Title"]</h1>
<h2>@Model.Message</h2>

<address>
    One Microsoft Way<br>
    Redmond, WA 98052-6399<br>
    <abbr title="Phone">P:</abbr>
    425.555.0100
</address>

<address>
    <strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br>
    <strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
</address>

<p>@Model.RouteDataTextTemplateValue</p>

Observera att URL:en som genererades för länken Kontakt på den renderade sidan återspeglar den uppdaterade vägen:

Kontaktlänk för exempelapp i navigeringsfältet

Om du inspekterar kontaktlänken i den renderade HTML-koden anges href till

Besök sidan Kontakt på den vanliga vägen, /Contacteller den anpassade vägen. /TheContactPage Om du anger ytterligare text ett vägsegment visar sidan det HTML-kodade segment som du anger:

Edge-webbläsarexempel på att ange ett valfritt

Åtgärdskonventioner för sidmodell

Standardprovidern för sidmodeller som implementerar IPageApplicationModelProvider anropar konventioner som är utformade för att tillhandahålla utökningspunkter för att konfigurera sidmodeller. Dessa konventioner är användbara när du skapar och ändrar scenarier för sididentifiering och bearbetning.

För exemplen i det här avsnittet använder exempelappen en AddHeaderAttribute klass, som är en ResultFilterAttribute, som tillämpar ett svarshuvud:

public class AddHeaderAttribute : ResultFilterAttribute
{
    private readonly string _name;
    private readonly string[] _values;

    public AddHeaderAttribute(string name, string[] values)
    {
        _name = name;
        _values = values;
    }

    public override void OnResultExecuting(ResultExecutingContext context)
    {
        context.HttpContext.Response.Headers.Add(_name, _values);
        base.OnResultExecuting(context);
    }
}

Med hjälp av konventioner visar exemplet hur du tillämpar attributet på alla sidor i en mapp och på en enda sida.

Modellkonvention för mappapp

Använd AddFolderApplicationModelConvention för att skapa och lägga till en IPageApplicationModelConvention som anropar en åtgärd på PageApplicationModel instanser för alla sidor under den angivna mappen.

Exemplet visar hur du använder AddFolderApplicationModelConvention genom att lägga till en rubrik, OtherPagesHeader, på sidorna i mappen OtherPages i appen:

options.Conventions.AddFolderApplicationModelConvention("/OtherPages", model =>
{
    model.Filters.Add(new AddHeaderAttribute(
        "OtherPagesHeader", new string[] { "OtherPages Header Value" }));
});

Begär exemplets sida 1 på localhost:5000/OtherPages/Page1 och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan OtherPages/Page1 visar att OtherPagesHeader har lagts till.

Modellkonvention för sidapp

Använd AddPageApplicationModelConvention för att skapa och lägga till en IPageApplicationModelConvention som anropar en åtgärd på PageApplicationModel sidan med det angivna namnet.

Exemplet visar hur du använder AddPageApplicationModelConvention genom att lägga till en rubrik, AboutHeader, på sidan Om:

options.Conventions.AddPageApplicationModelConvention("/About", model =>
{
    model.Filters.Add(new AddHeaderAttribute(
        "AboutHeader", new string[] { "About Header Value" }));
});

Begär exemplets Om-sida på localhost:5000/About och granska rubrikerna för att visa resultatet:

Responshuvuden på sidan Om visar att OmHeader har lagts till.

Konfigurera ett filter

ConfigureFilter konfigurerar det angivna filtret att gälla. Du kan implementera en filterklass, men exempelappen visar hur du implementerar ett filter i ett lambda-uttryck, som implementeras bakom kulisserna som en fabrik som returnerar ett filter:

options.Conventions.ConfigureFilter(model =>
{
    if (model.RelativePath.Contains("OtherPages/Page2"))
    {
        return new AddHeaderAttribute(
            "OtherPagesPage2Header", 
            new string[] { "OtherPages/Page2 Header Value" });
    }
    return new EmptyFilter();
});

Sidappsmodellen används för att kontrollera den relativa sökvägen för segment som leder till sidan Page2 i mappen OtherPages . Om villkoret godkänns läggs en rubrik till. Om inte, EmptyFilter tillämpas.

EmptyFilter är ett åtgärdsfilter. Eftersom Åtgärdsfilter ignoreras av Razor Sidor EmptyFilter har det ingen effekt som avsett om sökvägen inte innehåller OtherPages/Page2.

Begär exemplets sida 2 på localhost:5000/OtherPages/Page2 och granska rubrikerna för att visa resultatet:

OtherPagesPage2Header läggs till i svaret för Page2.

Konfigurera en filterfabrik

ConfigureFilter konfigurerar den angivna fabriken för att tillämpa filter på alla Razor sidor.

Exempelappen innehåller ett exempel på hur du använder en filterfabrik genom att lägga till en rubrik, FilterFactoryHeader, med två värden på appens sidor:

options.Conventions.ConfigureFilter(new AddHeaderWithFactory());

AddHeaderWithFactory.cs:

public class AddHeaderWithFactory : IFilterFactory
{
    // Implement IFilterFactory
    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        return new AddHeaderFilter();
    }

    private class AddHeaderFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            context.HttpContext.Response.Headers.Add(
                "FilterFactoryHeader", 
                new string[] 
                { 
                    "Filter Factory Header Value 1",
                    "Filter Factory Header Value 2"
                });
        }

        public void OnResultExecuted(ResultExecutedContext context)
        {
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

Begär exemplets Om-sida på localhost:5000/About och granska rubrikerna för att visa resultatet:

Svarshuvuden på sidan Om visar att två FilterFactoryHeader-huvuden har lagts till.

MVC-filter och sidfiltret (IPageFilter)

MVC-actionfilter ignoreras av Sidor, eftersom Razor Sidor använder hantermethoder. Du kan använda andra typer av MVC-filter: auktorisering, undantag, resurs och resultat. Mer information finns i avsnittet Filter .

Sidfiltret (IPageFilter) är ett filter som gäller för Razor Sidor. Mer information finns i Filtermetoder för Razor Pages.

Ytterligare resurser