Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
Orderoch 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:
- PageRouteModel Skickas till Apply -metoden.
- PageRouteModel.Selectors hämtar antalet väljare.
- En ny SelectorModel läggs till som innehåller en AttributeRouteModel
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. RuttenContact Pagehar standardordningennull(Order = 0), så den matchar före ruttmallen{globalTemplate?}som harOrder = 1.Routningsmallen
{aboutTemplate?}visas i föregående kod. Mallen{aboutTemplate?}får enOrderav2. När sidan Om begärs på/About/RouteDataValueläses "RouteDataValue" in iRouteData.Values["globalTemplate"](Order = 1) och inteRouteData.Values["aboutTemplate"](Order = 2) på grund av att egenskapenOrderhar angetts.Vägmallen
{otherPagesTemplate?}visas i föregående kod. Mallen{otherPagesTemplate?}får enOrderav2. När en sida i mappen Pages/OtherPages begärs med en vägparameter:Till exempel:
/OtherPages/Page1/xyzVärdet för routningsdata
"xyz"läses in iRouteData.Values["globalTemplate"](Order = 1).RouteData.Values["otherPagesTemplate"]med (Order = 2) har inte lästs in på grund av att egenskapenOrder2har 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:
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:
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:
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:
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
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:
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:
Å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:
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:
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:
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:
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
|
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 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
Orderoch 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 avnull(Order = 0), så den matchar före ruttemplaten{globalTemplate?}. - En
{aboutTemplate?}routemall läggs till senare i avsnittet. Mallen{aboutTemplate?}får enOrderav2. När sidan Om begärs på/About/RouteDataValueläses "RouteDataValue" in iRouteData.Values["globalTemplate"](Order = 1) och inteRouteData.Values["aboutTemplate"](Order = 2) på grund av att egenskapenOrderhar angetts. - En
{otherPagesTemplate?}routemall läggs till senare i avsnittet. Mallen{otherPagesTemplate?}får enOrderav2. När en sida i mappen Pages/OtherPages begärs med en vägparameter (till exempel/OtherPages/Page1/RouteDataValue), läses "RouteDataValue" in iRouteData.Values["globalTemplate"](Order = 1) och inteRouteData.Values["otherPagesTemplate"](Order = 2) på grund av att egenskapen har angettsOrder.
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:
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:
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:
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:
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:
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:
Å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:
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:
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:
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:
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
|
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 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
Orderoch 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 avnull(Order = 0), så den matchar före ruttemplaten{globalTemplate?}. - En
{aboutTemplate?}routemall läggs till senare i avsnittet. Mallen{aboutTemplate?}får enOrderav2. När sidan Om begärs på/About/RouteDataValueläses "RouteDataValue" in iRouteData.Values["globalTemplate"](Order = 1) och inteRouteData.Values["aboutTemplate"](Order = 2) på grund av att egenskapenOrderhar angetts. - En
{otherPagesTemplate?}routemall läggs till senare i avsnittet. Mallen{otherPagesTemplate?}får enOrderav2. När en sida i mappen Pages/OtherPages begärs med en vägparameter (till exempel/OtherPages/Page1/RouteDataValue), läses "RouteDataValue" in iRouteData.Values["globalTemplate"](Order = 1) och inteRouteData.Values["otherPagesTemplate"](Order = 2) på grund av att egenskapen har angettsOrder.
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:
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:
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:
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:
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:
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:
Å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:
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:
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:
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:
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
ASP.NET Core