RazorSměrování stránek a konvence aplikací v ASP.NET Core

Naučte se používat konvence směrování stránky a poskytovatele modelů aplikací k řízení směrování, zjišťování a zpracování stránky v Razor aplikacích stránky.

Pokud potřebujete nakonfigurovat vlastní trasy stránky pro jednotlivé stránky, nakonfigurujte směrování na stránky pomocí AddPageRoute konvence popsané dále v tomto tématu.

Chcete-li určit trasu stránky, přidat segmenty směrování nebo přidat parametry do trasy, použijte @page direktivu stránky. Další informace najdete v tématu vlastní trasy.

Existují vyhrazená slova, která nelze použít jako segmenty směrování nebo názvy parametrů. Další informace najdete v tématu směrování: názvy rezervovaných směrování.

Zobrazit nebo stáhnout ukázkový kód (Jak stáhnout)

Scenario Ukázka znázorňuje...
Modelové konvence

Konvence. Add
  • IPageRouteModelConvention
  • IPageApplicationModelConvention
  • IPageHandlerModelConvention
Přidejte šablonu a hlavičku směrování na stránky aplikace.
Konvence akcí při směrování stránky
  • AddFolderRouteModelConvention
  • AddPageRouteModelConvention
  • AddPageRoute
Přidejte šablonu směrování do stránek ve složce a na jednu stránku.
Konvence akcí modelu stránky
  • AddFolderApplicationModelConvention
  • AddPageApplicationModelConvention
  • ConfigureFilter (filtrovat třídu, lambda výraz nebo objekt pro vytváření filtru)
Umožňuje přidat záhlaví na stránky ve složce, přidat záhlaví na jednu stránku a nakonfigurovat objekt pro vytváření filtru tak, aby přidal hlavičku na stránky aplikace.

Razor Konvence stránek jsou konfigurovány pomocí AddRazorPages přetížení, které konfiguruje RazorPagesOptions v Startup.ConfigureServices . Následující příklady konvence jsou vysvětleny dále v tomto tématu:

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( ... );
    });
}

Pořadí směrování

Trasy určují Order pro zpracování (odpovídání tras).

Objednávka Chování
-1 Trasa je zpracována před zpracováním jiných tras.
0 Pořadí není zadáno (výchozí hodnota). Nepřiřazuje se Order ( Order = null ) výchozí hodnota trasy Order na 0 (nula) pro zpracování.
1, 2, … n Určuje pořadí zpracování směrování.

Zpracování směrování je zřízené podle konvence:

  • Trasy jsou zpracovávány v sekvenčním pořadí (-1, 0, 1, 2, … n).
  • V případě, že trasy mají stejný směr Order , je nejdříve porovnána konkrétní trasa, za kterou následuje méně specifických tras.
  • Když se trasy se stejným Order počtem parametrů shodují s adresou URL požadavku, trasy se zpracovávají v pořadí, v jakém jsou přidány do PageConventionCollection .

Pokud je to možné, vyhněte se v závislosti na zavedeném pořadí zpracování směrování. Obecně směrování vybírá správnou trasu s odpovídající adresou URL. Pokud musíte nastavit vlastnosti směrování Order na správně směrované požadavky, schéma směrování aplikace je pravděpodobně matoucí pro klienty a křehké na údržbu. Vyhledejte zjednodušené schéma směrování aplikace. Ukázková aplikace vyžaduje explicitní pořadí zpracování tras, které předvádí několik scénářů směrování pomocí jedné aplikace. Měli byste se však pokusit vyhnout postup nastavení trasy Order v produkčních aplikacích.

Razor Směrování stránek a směrování kontroléru MVC sdílí implementaci. Informace o pořadí směrování v tématech MVC jsou k dispozici při směrování na akce kontroleru: trasy atributů řazení.

Modelové konvence

Přidejte delegáta pro IPageConvention Přidání modelových konvencí , které se vztahují na Razor stránky.

Přidat konvenci modelu směrování na všechny stránky

Slouží Conventions k vytvoření a přidání IPageRouteModelConvention kolekce IPageConvention instancí, které se použijí během vytváření modelu směrování stránky.

Ukázková aplikace přidá {globalTemplate?} šablonu směrování na všechny stránky v aplikaci:

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?}"),
                }
            });
        }
    }
}

OrderVlastnost pro AttributeRouteModel je nastavena na 1 . Tím se zajistí následující chování při shodě trasy v ukázkové aplikaci:

  • Šablona směrování pro TheContactPage/{text?} je přidána později v tématu. Trasa stránky kontaktu má výchozí pořadí null ( Order = 0 ), takže odpovídá před {globalTemplate?} šablonou směrování.
  • {aboutTemplate?}Šablona směrování se přidá později v tématu. {aboutTemplate?}Šabloně je přidělena Order 2 . Když se na stránce o žádosti vyžádá /About/RouteDataValue , "RouteDataValue" se načte do RouteData.Values["globalTemplate"] ( Order = 1 ) a RouteData.Values["aboutTemplate"] ne ( Order = 2 ) kvůli nastavení Order Vlastnosti.
  • {otherPagesTemplate?}Šablona směrování se přidá později v tématu. {otherPagesTemplate?}Šabloně je přidělena Order 2 . Pokud je pro libovolnou stránku ve složce Pages/OtherPages požadováno parametr trasy (například /OtherPages/Page1/RouteDataValue ), je hodnota "RouteDataValue" načtena do RouteData.Values["globalTemplate"] ( Order = 1 ) a nikoli RouteData.Values["otherPagesTemplate"] ( Order = 2 ) z důvodu nastavení Order Vlastnosti.

Pokud je to možné, nenastavte Order , které výsledky mají Order = 0 . Pro výběr správné trasy se spoléhá na směrování.

Razor Možnosti stránek, jako je například přidání Conventions , jsou přidány při Razor Přidání stránek do kolekce služeb v nástroji Startup.ConfigureServices . Příklad najdete v ukázkové aplikaci.

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

Požádejte o stránku ukázek o stránce localhost:5000/About/GlobalRouteValue a Prohlédněte si výsledek:

Stránka o aplikaci je požadována s segmentem směrování GlobalRouteValue. Vykreslená stránka ukazuje, že hodnota dat trasy je zachycena v metodě OnGet stránky.

Přidání konvence modelu aplikace na všechny stránky

Použijte Conventions k vytvoření a přidání IPageApplicationModelConvention do kolekce IPageConvention instancí, které se použijí během vytváření modelu aplikace stránky.

Chcete-li předvést tuto a další konvenci později v tématu, ukázková aplikace obsahuje AddHeaderAttribute třídu. Konstruktor třídy přijímá name řetězec a values pole řetězců. Tyto hodnoty jsou použity v OnResultExecuting metodě pro nastavení hlavičky odpovědi. Úplná třída je uvedena v části konvence akcí modelu stránky dále v tématu.

Ukázková aplikace používá AddHeaderAttribute třídu k přidání záhlaví, na GlobalHeader všechny stránky v aplikaci:

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());

Požádejte o stránku ukázek o stránce localhost:5000/About a Prohlédněte si záhlaví a podívejte se na výsledek:

Hlavičky odpovědi stránky o produktu ukazují, že byl přidán GlobalHeader.

Přidat konvenci modelu obslužné rutiny na všechny stránky

Použijte Conventions k vytvoření a přidání IPageHandlerModelConvention do kolekce IPageConvention instancí, které jsou použity během vytváření modelu obslužné rutiny stránky.

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

Startup. cs:

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

Konvence akcí při směrování stránky

Výchozí zprostředkovatel modelu směrování, který je odvozen od IPageRouteModelProvider konvencí vyvolání, které jsou navrženy tak, aby poskytovaly body rozšiřitelnosti pro konfiguraci tras stránky.

Konvence modelu směrování složky

Slouží AddFolderRouteModelConvention k vytvoření a přidání IPageRouteModelConvention akce, která vyvolá akci PageRouteModel pro všechny stránky v zadané složce.

Ukázková aplikace používá AddFolderRouteModelConvention k přidání {otherPagesTemplate?} šablony směrování na stránky ve složce 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?}"),
            }
        });
    }
});

OrderVlastnost pro AttributeRouteModel je nastavena na 2 . Tím se zajistí, že šablona pro {globalTemplate?} (nastavená výše v tématu na 1 ) má prioritu první pozice hodnoty dat trasy při zadání jedné hodnoty trasy. Pokud se stránka ve složce Pages/OtherPages požaduje s hodnotou parametru trasy (například /OtherPages/Page1/RouteDataValue ), "RouteDataValue" se načte do RouteData.Values["globalTemplate"] ( Order = 1 ) a ne RouteData.Values["otherPagesTemplate"] ( Order = 2 ) kvůli nastavení Order Vlastnosti.

Pokud je to možné, nenastavte Order , které výsledky mají Order = 0 . Pro výběr správné trasy se spoléhá na směrování.

Vyžádejte si Page1 stránku ukázky localhost:5000/OtherPages/Page1/GlobalRouteValue/OtherPagesRouteValue a Prohlédněte si výsledek:

Page1 ve složce OtherPages se vyžádá s segmentem směrování GlobalRouteValue a OtherPagesRouteValue. Vykreslená stránka ukazuje, že hodnoty dat tras jsou zachyceny v metodě OnGet stránky.

Konvence modelu směrování stránek

Slouží k vytvoření a přidání , která vyvolá akci na stránce AddPageRouteModelConvention IPageRouteModelConvention se PageRouteModel zadaným názvem.

Ukázková aplikace používá AddPageRouteModelConvention k přidání šablony trasy na stránku O {aboutTemplate?} aplikaci:

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?}"),
            }
        });
    }
});

Vlastnost Order objektu je AttributeRouteModel nastavená na 2 . Tím se zajistí, že šablona pro (nastavená dříve v tématu na ) bude mít prioritu pro první pozici hodnoty dat trasy, když je zadaná {globalTemplate?} 1 jedna hodnota trasy. Pokud se kvůli nastavení vlastnosti vyžádá stránka O službě s parametrem trasy v , načte se hodnota RouteDataValue do ( ) a ne /About/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["aboutTemplate"] Order = 2 Order ).

Všude, kde je to možné, Order nastavte , což vede k Order = 0 . Při výběru správné trasy se spoléhejte na směrování.

Vyžádejte si stránku o ukázce na adrese a localhost:5000/About/GlobalRouteValue/AboutRouteValue zkontrolujte výsledek:

O stránce se požaduje segmenty tras pro GlobalRouteValue a AboutRouteValue. Vykreslená stránka ukazuje, že hodnoty dat tras jsou zachyceny v metodě OnGet stránky.

Přizpůsobení tras stránek pomocí parameter transformeru

Trasy stránek generované službou ASP.NET Core je možné přizpůsobit pomocí parameter transformeru. Transformace parametrů implementuje a IOutboundParameterTransformer transformuje hodnotu parametrů. Například transformátor vlastních SlugifyParameterTransformer parametrů změní hodnotu trasy na SubscriptionManagement subscription-management .

Konvence modelu směrování stránky používá pro segmenty složek a názvů souborů automaticky generovaných tras stránek v PageRouteTransformerConvention aplikaci transformátor parametrů. Například soubor Pages v Razor /Pages/SubscriptionManagement/ViewAll.cshtml by přepsal svou trasu z /SubscriptionManagement/ViewAll na /subscription-management/view-all .

PageRouteTransformerConvention Transformuje pouze automaticky generované segmenty trasy stránky, které pocházejí ze složky Pages a Razor názvu souboru. Netransformuje segmenty tras přidané pomocí @page direktivy . Tato konvence také netransformuje trasy přidané pomocí AddPageRoute .

Parametr PageRouteTransformerConvention je zaregistrovaný jako možnost v 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();
    }
}

Upozornění

Při použití System.Text.RegularExpressions ke zpracování nedůvěryhodného vstupu předejte časový limit. Uživatel se zlými úmysly může poskytnout vstup pro RegularExpressions útok DoS (Denial-of-Service). Rozhraní API rozhraní ASP.NET Core Framework, která používají RegularExpressions předávat časový limit.

Konfigurace trasy stránky

Slouží AddPageRoute ke konfiguraci trasy na stránku v zadané cestě stránky. Vygenerované odkazy na stránku používají zadanou trasu. AddPageRoute používá AddPageRouteModelConvention k vytvoření trasy.

Ukázková aplikace vytvoří trasu pro /TheContactPage Contact.cshtml:

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

Stránka Kontakt je také přístupná /Contact přes výchozí trasu.

Vlastní trasa ukázkové aplikace na stránku Kontakt umožňuje volitelný text segment trasy ( {text?} ). Stránka také obsahuje tento volitelný segment ve své direktivě pro případ, že návštěvník přistupuje @page na stránku na své /Contact trase:

@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>

Všimněte si, že adresa URL vygenerovaná pro odkaz Kontakt na vykreslené stránce odráží aktualizovanou trasu:

Odkaz kontaktu ukázkové aplikace na navigačním panelu

Kontrola odkazu Contact ve vykreslené html značí, že je href nastavený na /TheContactPage.

Navštivte stránku Kontakt na běžné trase /Contact nebo na vlastní trase /TheContactPage . Pokud zadáte další segment trasy, na stránce se zobrazí segment s kódováním text HTML, který poskytnete:

Příklad prohlížeče Edge s volitelným segmentem trasy TextValue v adrese URL. Vykreslená stránka zobrazuje hodnotu segmentu text.

Konvence akcí modelu stránek

Výchozí poskytovatel modelu stránky, který implementuje, vyvolá konvence, které jsou navržené tak, aby poskytovaly body rozšiřitelnosti pro IPageApplicationModelProvider konfiguraci modelů stránek. Tyto konvence jsou užitečné při vytváření a úpravách scénářů zjišťování a zpracování stránek.

Pro příklady v této části používá ukázková aplikace třídu , což je třída , která používá AddHeaderAttribute ResultFilterAttribute hlavičku odpovědi:

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);
    }
}

Pomocí konvencí ukázka ukazuje, jak použít atribut na všechny stránky ve složce a na jednu stránku.

Konvence modelu aplikace složek

Slouží k vytvoření a přidání objektu , který vyvolá akci na instancích pro všechny AddFolderApplicationModelConvention stránky v zadané IPageApplicationModelConvention PageApplicationModel složce.

Ukázka demonstruje použití přidáním hlavičky na stránky ve složce AddFolderApplicationModelConvention OtherPagesHeader OtherPages aplikace:

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

Vyžádejte si stránku Page1 ukázky na adrese a zkontrolujte localhost:5000/OtherPages/Page1 hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi stránky OtherPages/Page1 ukazují, že byl přidán hlavička OtherPagesHeader.

Konvence modelu stránkové aplikace

Slouží k vytvoření a přidání , která vyvolá akci na stránce AddPageApplicationModelConvention IPageApplicationModelConvention se PageApplicationModel zadaným názvem.

Ukázka demonstruje použití AddPageApplicationModelConvention přidáním hlavičky AboutHeader na stránku O službě:

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

Vyžádejte si stránku o ukázce na adrese a zkontrolujte localhost:5000/About hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi na stránce About ukazují, že byl přidán hlavička AboutHeader.

Konfigurace filtru

ConfigureFilter nakonfiguruje zadaný filtr na použití. Můžete implementovat třídu filtru, ale ukázková aplikace ukazuje, jak implementovat filtr ve výrazu lambda, který je implementován na pozadí jako objekt pro vytváření, který vrací filtr:

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

Model aplikace stránky slouží ke kontrole relativní cesty pro segmenty, které vedou na stránku Page2 ve složce OtherPages. Pokud podmínka projde, přidá se hlavička. Pokud ne, EmptyFilter použije se .

EmptyFilter je filtr akce. Vzhledem k tomu, že filtry akcí jsou stránkami ignorovány, nemá objekt žádný zamýšlený účinek, pokud Razor EmptyFilter cesta neobsahuje OtherPages/Page2 .

Vyžádejte si stránku Page2 ukázky na adrese a zkontrolujte localhost:5000/OtherPages/Page2 hlavičky, abyste si výsledek prohlédněte:

Do odpovědi pro Page2 se přidá Hlavička OtherPagesPage2Header.

Konfigurace objekt pro vytváření filtrů

ConfigureFilter nakonfiguruje zadanou továrnu na použití filtrů na všechny Razor stránky.

Ukázková aplikace nabízí příklad použití objektu pro vytváření filtrů přidáním hlavičky se dvěma hodnotami na FilterFactoryHeader stránky aplikace:

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;
        }
    }
}

Vyžádejte si stránku o ukázce na adrese a zkontrolujte localhost:5000/About hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi na stránce About ukazují, že byly přidány dvě hlavičky FilterFactoryHeader.

Filtry MVC a filtr stránky (IPageFilter)

Filtry akcí MVC stránky ignorují, Razor protože Pages používají metody obslužné Razor rutiny. K dispozici jsou další typy filtrů MVC: Autorizace, Výjimka, Prostředeka Výsledek. Další informace najdete v tématu Filtry.

Filtr Stránky ( IPageFilter ) je filtr, který se vztahuje na Razor stránky. Další informace najdete v tématu Metody filtrování pro Razor stránky.

Další zdroje informací

Naučte se používat trasy stránek a konvence poskytovatelů modelů aplikací k řízení směrování, zjišťování a zpracování stránek v Razor aplikacích Pages.

Pokud potřebujete nakonfigurovat vlastní trasy stránek pro jednotlivé stránky, nakonfigurujte směrování na stránky pomocí konvence AddPageRoute popsané dále v tomto tématu.

Pokud chcete zadat trasu stránky, přidat segmenty tras nebo přidat do trasy parametry, použijte direktivu @page stránky. Další informace najdete v tématu Vlastní trasy.

Existují vyhrazená slova, která nelze použít jako segmenty tras nebo názvy parametrů. Další informace najdete v tématu Směrování: Vyhrazené názvy směrování.

Zobrazení nebo stažení ukázkového kódu (stažení)

Scenario Ukázka ukazuje...
Modelové konvence

Conventions.Add
  • IPageRouteModelConvention
  • IPageApplicationModelConvention
  • IPageHandlerModelConvention
Přidejte šablonu trasy a hlavičku na stránky aplikace.
Konvence akcí směrování stránek
  • AddFolderRouteModelConvention
  • AddPageRouteModelConvention
  • AddPageRoute
Přidejte šablonu trasy na stránky ve složce a na jednu stránku.
Konvence akcí modelu stránek
  • AddFolderApplicationModelConvention
  • AddPageApplicationModelConvention
  • ConfigureFilter (třída filtru, výraz lambda nebo objekt pro vytváření filtrů)
Přidejte záhlaví na stránky ve složce, přidejte záhlaví na jednu stránku a nakonfigurujte objekt pro vytváření filtrů tak, aby na stránky aplikace přidá hlavičku.

Razor Konvence stránek se přidávají a konfiguruje pomocí metody rozšíření pro v AddRazorPagesOptions kolekci služby ve třídě AddMvc Startup . Následující příklady konvencí jsou vysvětleny dále v tomto tématu:

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( ... );
        });
}

Pořadí tras

Trasy určují pro Order zpracování (párování tras).

Objednávka Chování
-1 Trasa se zpracuje před zpracováním dalších tras.
0 Order (Objednávka) není zadaná (výchozí hodnota). Při nepřiřazování ( ) se jako výchozí trasa pro zpracování přiřadí Order Order = null hodnota Order 0 (nula).
1, 2, … n Určuje pořadí zpracování tras.

Zpracování tras se stanoví podle konvence:

  • Trasy se zpracovávají v sekvenčním pořadí (-1, 0, 1, 2, … n).
  • Pokud trasy mají stejnou shodu, nejvíce konkrétní trasa se nejprve porovná s méně Order specifickými trasami.
  • Pokud trasy se stejným počtem parametrů odpovídají adrese URL požadavku, trasy se zpracují v pořadí, ve které se Order přidávají do PageConventionCollection .

Pokud je to možné, vyhněte se v závislosti na stanoveném pořadí zpracování tras. Směrování obecně vybere správnou trasu s odpovídající adresou URL. Pokud musíte nastavit vlastnosti trasy pro správné směrování požadavků, je schéma směrování aplikace pravděpodobně matoucí pro klienty a údržba Order je nepřehledná. Hledejte zjednodušení schématu směrování aplikace. Ukázková aplikace vyžaduje explicitní pořadí zpracování tras, aby bylo možné pomocí jedné aplikace předvést několik scénářů směrování. Měli byste se ale pokusit vyhnout postupu nastavení trasy v Order produkčních aplikacích.

Razor Směrování stránek a směrování kontroleru MVC sdílejí implementaci. Informace o pořadí tras v tématech o MVC jsou k dispozici v tématu Směrování na akce kontroleru: Řazení tras atributů.

Modelové konvence

Přidejte delegáta pro IPageConvention , který přidá konvence modelu, které platí pro Razor Pages.

Přidání konvence modelu tras na všechny stránky

Slouží k vytvoření a přidání do kolekce instancí, které jsou Conventions použity během vytváření modelu trasy IPageRouteModelConvention IPageConvention stránky.

Ukázková aplikace přidá {globalTemplate?} šablonu trasy na všechny stránky v aplikaci:

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?}"),
                }
            });
        }
    }
}

Vlastnost Order objektu je AttributeRouteModel nastavená na 1 . Tím se zajistí následující chování při porovnávání tras v ukázkové aplikaci:

  • Šablona trasy pro TheContactPage/{text?} se přidá později v tématu. Trasa Kontaktní stránka má výchozí pořadí ( ), takže se shoduje před null Order = 0 {globalTemplate?} šablonou trasy.
  • Šablona {aboutTemplate?} trasy se přidá později v tématu. Šablona {aboutTemplate?} má parametr Order 2 . Při vyžádání stránky O službě se kvůli nastavení vlastnosti načte hodnota RouteDataValue do ( ) a ne /About/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["aboutTemplate"] Order = 2 Order ).
  • Šablona {otherPagesTemplate?} trasy se přidá později v tématu. Šablona {otherPagesTemplate?} má parametr Order 2 . Pokud se kvůli nastavení vlastnosti požaduje jakákoli stránka ve složce Pages/OtherPages s parametrem trasy (například ), načte se routeDataValue do ( ) a ne /OtherPages/Page1/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["otherPagesTemplate"] Order = 2 Order ).

Všude, kde je to možné, nastavte Order , což má za výsledek Order = 0 . Při výběru správné trasy se spoléhejte na směrování.

Razor Možnosti stránek, například přidání , se při přidání MVC do kolekce služby v Conventions Startup.ConfigureServices přidávají. Příklad najdete v ukázkové aplikaci.

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

Vyžádejte si stránku o ukázce na adrese a localhost:5000/About/GlobalRouteValue prohlédněte si výsledek:

Stránka O službě se požaduje se segmentem trasy GlobalRouteValue. Vykreslená stránka ukazuje, že hodnota dat trasy je zachycena v metodě OnGet stránky.

Přidání konvence modelu aplikace na všechny stránky

Slouží k vytvoření a přidání do kolekce instancí, které jsou Conventions použity během vytváření modelu aplikace IPageApplicationModelConvention IPageConvention stránky.

K předvedení této a dalších konvencí dále v tomto tématu obsahuje ukázková aplikace AddHeaderAttribute třídu . Konstruktor třídy přijímá řetězec name a values pole řetězců. Tyto hodnoty se ve své OnResultExecuting metodě používají k nastavení hlavičky odpovědi. Úplná třída je uvedena v části Konvence akcí modelu stránky dále v tématu.

Ukázková aplikace používá třídu k přidání hlavičky na všechny AddHeaderAttribute stránky v GlobalHeader aplikaci:

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());

Vyžádejte si stránku o ukázce na adrese a zkontrolujte localhost:5000/About hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi na stránce O službě ukazují, že byl přidán hlavička GlobalHeader.

Přidání konvence modelu obslužné rutiny na všechny stránky

Slouží k vytvoření a přidání do kolekce instancí, které jsou použity během vytváření modelu Conventions IPageHandlerModelConvention obslužné rutiny IPageConvention stránky.

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

Startup.cs:

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

Konvence akcí směrování stránek

Výchozí poskytovatel modelu směrování odvozený z vyvolává konvence, které jsou navrženy tak, aby poskytovaly body rozšiřitelnosti pro IPageRouteModelProvider konfiguraci tras stránek.

Konvence modelu směrování složek

Slouží k vytvoření a přidání , která vyvolá akci na pro všechny stránky AddFolderRouteModelConvention IPageRouteModelConvention v zadané PageRouteModel složce.

Ukázková aplikace používá AddFolderRouteModelConvention k přidání šablony trasy na stránky ve {otherPagesTemplate?} složce 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?}"),
            }
        });
    }
});

Vlastnost Order objektu je AttributeRouteModel nastavená na 2 . Tím se zajistí, že šablona pro (nastavená dříve v tématu na ) bude mít prioritu pro první pozici hodnoty dat trasy, pokud je zadaná {globalTemplate?} 1 jedna hodnota trasy. Pokud se kvůli nastavení vlastnosti vyžádá stránka ve složce Pages/OtherPages s hodnotou parametru trasy (například ), načte se routeDataValue do ( ) a ne /OtherPages/Page1/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["otherPagesTemplate"] Order = 2 Order ).

Všude, kde je to možné, nastavte Order , což má za výsledek Order = 0 . Při výběru správné trasy se spoléhejte na směrování.

Vyžádejte si stránku Page1 ukázky na adrese a localhost:5000/OtherPages/Page1/GlobalRouteValue/OtherPagesRouteValue zkontrolujte výsledek:

Stránka Page1 ve složce OtherPages se požaduje se segmentem trasy GlobalRouteValue a OtherPagesRouteValue. Vykreslená stránka ukazuje, že hodnoty dat tras jsou zachyceny v metodě OnGet stránky.

Konvence modelu směrování stránek

Slouží k vytvoření a přidání , která vyvolá akci na stránce AddPageRouteModelConvention IPageRouteModelConvention se PageRouteModel zadaným názvem.

Ukázková aplikace používá AddPageRouteModelConvention k přidání šablony trasy na stránku O {aboutTemplate?} aplikaci:

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?}"),
            }
        });
    }
});

Vlastnost Order objektu je AttributeRouteModel nastavená na 2 . Tím se zajistí, že šablona pro (nastavená dříve v tématu na ) bude mít prioritu pro první pozici hodnoty dat trasy, pokud je zadaná {globalTemplate?} 1 jedna hodnota trasy. Pokud se kvůli nastavení vlastnosti vyžádá stránka O službě s parametrem trasy v , načte se hodnota RouteDataValue do ( ) a ne /About/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["aboutTemplate"] Order = 2 Order ).

Všude, kde je to možné, nastavte Order , což má za výsledek Order = 0 . Při výběru správné trasy se spoléhejte na směrování.

Vyžádejte si stránku o ukázce na adrese a localhost:5000/About/GlobalRouteValue/AboutRouteValue prohlédněte si výsledek:

O stránce se požaduje segmenty tras pro GlobalRouteValue a AboutRouteValue. Vykreslená stránka ukazuje, že hodnoty dat tras jsou zachyceny v metodě OnGet stránky.

Přizpůsobení tras stránek pomocí parameter transformeru

Trasy stránek generované službou ASP.NET Core lze přizpůsobit pomocí parameter transformeru. Transformace parametrů implementuje a IOutboundParameterTransformer transformuje hodnotu parametrů. Například transformátor vlastních SlugifyParameterTransformer parametrů změní hodnotu trasy na SubscriptionManagement subscription-management .

Konvence modelu směrování stránky používá pro segmenty složek a názvů souborů automaticky generovaných tras stránek v PageRouteTransformerConvention aplikaci transformátor parametrů. Například soubor Pages v Razor /Pages/SubscriptionManagement/ViewAll.cshtml by přepsal svou trasu z /SubscriptionManagement/ViewAll na /subscription-management/view-all .

PageRouteTransformerConvention Transformuje pouze automaticky generované segmenty trasy stránky, které pocházejí ze složky Pages a Razor názvu souboru. Netransformuje segmenty tras přidané pomocí @page direktivy . Tato konvence také netransformuje trasy přidané pomocí AddPageRoute .

Parametr PageRouteTransformerConvention je zaregistrovaný jako možnost v Startup.ConfigureServices :

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.Add(
                new PageRouteTransformerConvention(
                    new SlugifyParameterTransformer()));
        });
}

public class SlugifyParameterTransformer : IOutboundParameterTransformer
{
    public string TransformOutbound(object value)
    {
        if (value == null) { return null; }

        // Slugify value
        return Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower();
    }
}

Konfigurace trasy stránky

Slouží AddPageRoute ke konfiguraci trasy na stránku v zadané cestě stránky. Vygenerované odkazy na stránku používají zadanou trasu. AddPageRoute používá AddPageRouteModelConvention k vytvoření trasy.

Ukázková aplikace vytvoří trasu pro /TheContactPage Contact.cshtml:

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

Stránka Kontakt je také přístupná /Contact přes výchozí trasu.

Vlastní trasa ukázkové aplikace na stránku Kontakt umožňuje volitelný text segment trasy ( {text?} ). Stránka také obsahuje tento volitelný segment ve své direktivě pro případ, že návštěvník přistupuje @page na stránku na své /Contact trase:

@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>

Všimněte si, že adresa URL vygenerovaná pro odkaz Kontakt na vykreslené stránce odráží aktualizovanou trasu:

Odkaz kontaktu ukázkové aplikace na navigačním panelu

Kontrola odkazu Contact ve vykreslené html značí, že je href nastavený na /TheContactPage.

Navštivte stránku Kontakt na běžné trase /Contact nebo na vlastní trase /TheContactPage . Pokud zadáte další segment trasy, na stránce se zobrazí segment s kódováním text HTML, který poskytnete:

Příklad prohlížeče Edge, který v adrese URL poskytuje volitelný segment trasy TextValue. Vykreslená stránka zobrazuje hodnotu segmentu text.

Konvence akcí modelu stránek

Výchozí poskytovatel modelu stránky, který implementuje, vyvolá konvence, které jsou navrženy tak, aby poskytovaly body rozšiřitelnosti IPageApplicationModelProvider pro konfiguraci modelů stránek. Tyto konvence jsou užitečné při vytváření a úpravách scénářů zjišťování a zpracování stránek.

Pro příklady v této části používá ukázková aplikace třídu , což je třída , která používá AddHeaderAttribute ResultFilterAttribute hlavičku odpovědi:

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);
    }
}

Pomocí konvencí ukázka ukazuje, jak použít atribut na všechny stránky ve složce a na jednu stránku.

Konvence modelu aplikace složek

Slouží k vytvoření a přidání objektu , který vyvolá akci na instancích pro všechny AddFolderApplicationModelConvention stránky v zadané IPageApplicationModelConvention PageApplicationModel složce.

Ukázka demonstruje použití přidáním hlavičky na stránky ve složce AddFolderApplicationModelConvention OtherPagesHeader OtherPages aplikace:

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

Vyžádejte si stránku Page1 ukázky na adrese a zkontrolujte localhost:5000/OtherPages/Page1 hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi stránky OtherPages/Page1 ukazují, že byla přidána hlavička OtherPagesHeader.

Konvence modelu aplikace stránky

Slouží k vytvoření a přidání , která vyvolá akci na stránce AddPageApplicationModelConvention IPageApplicationModelConvention se PageApplicationModel zadaným názvem.

Ukázka demonstruje použití AddPageApplicationModelConvention přidáním hlavičky AboutHeader na stránku O službě:

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

Vyžádejte si stránku o ukázce na adrese a zkontrolujte localhost:5000/About hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi na stránce About ukazují, že byl přidán hlavička AboutHeader.

Konfigurace filtru

ConfigureFilter nakonfiguruje zadaný filtr na použití. Můžete implementovat třídu filtru, ale ukázková aplikace ukazuje, jak implementovat filtr ve výrazu lambda, který je implementován na pozadí jako objekt pro vytváření, který vrací filtr:

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

Model aplikace stránky slouží ke kontrole relativní cesty pro segmenty, které vedou na stránku Page2 ve složce OtherPages. Pokud podmínka projde, přidá se hlavička. Pokud ne, EmptyFilter použije se .

EmptyFilter je filtr akce. Vzhledem k tomu, že filtry akcí jsou stránkami ignorovány, nemá objekt žádný zamýšlený účinek, pokud Razor EmptyFilter cesta neobsahuje OtherPages/Page2 .

Vyžádejte si stránku Page2 ukázky na adrese a zkontrolujte localhost:5000/OtherPages/Page2 hlavičky, abyste si výsledek prohlédněte:

Do odpovědi pro Page2 se přidá Hlavička OtherPagesPage2Header.

Konfigurace objekt pro vytváření filtrů

ConfigureFilter nakonfiguruje zadanou továrnu na použití filtrů na všechny Razor stránky.

Ukázková aplikace nabízí příklad použití objektu pro vytváření filtrů přidáním hlavičky se dvěma hodnotami na FilterFactoryHeader stránky aplikace:

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;
        }
    }
}

Vyžádejte si stránku o ukázce na adrese a zkontrolujte localhost:5000/About hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi na stránce About ukazují, že byly přidány dvě hlavičky FilterFactoryHeader.

Filtry MVC a filtr stránky (IPageFilter)

Filtry akcí MVC stránky ignorují, Razor protože Pages používají metody obslužné Razor rutiny. K dispozici jsou další typy filtrů MVC: Autorizace, Výjimka, Prostředeka Výsledek. Další informace najdete v tématu Filtry.

Filtr Stránky ( IPageFilter ) je filtr, který se vztahuje na Razor stránky. Další informace najdete v tématu Metody filtrování pro Razor stránky.

Další zdroje informací

Naučte se používat trasy stránek a konvence poskytovatelů modelů aplikací k řízení směrování, zjišťování a zpracování stránek v Razor aplikacích Pages.

Pokud potřebujete nakonfigurovat vlastní trasy stránek pro jednotlivé stránky, nakonfigurujte směrování na stránky pomocí konvence AddPageRoute popsané dále v tomto tématu.

Pokud chcete zadat trasu stránky, přidat segmenty tras nebo přidat do trasy parametry, použijte direktivu @page stránky. Další informace najdete v tématu Vlastní trasy.

Existují vyhrazená slova, která nelze použít jako segmenty tras nebo názvy parametrů. Další informace najdete v tématu Směrování: Vyhrazené názvy směrování.

Zobrazení nebo stažení ukázkového kódu (stažení)

Scenario Ukázka ukazuje...
Modelové konvence

Conventions.Add
  • IPageRouteModelConvention
  • IPageApplicationModelConvention
  • IPageHandlerModelConvention
Přidejte šablonu trasy a hlavičku na stránky aplikace.
Konvence akcí směrování stránek
  • AddFolderRouteModelConvention
  • AddPageRouteModelConvention
  • AddPageRoute
Přidejte šablonu trasy na stránky ve složce a na jednu stránku.
Konvence akcí modelu stránek
  • AddFolderApplicationModelConvention
  • AddPageApplicationModelConvention
  • ConfigureFilter (třída filtru, výraz lambda nebo objekt pro vytváření filtrů)
Přidejte záhlaví na stránky ve složce, přidejte záhlaví na jednu stránku a nakonfigurujte objekt pro vytváření filtrů tak, aby na stránky aplikace přidá hlavičku.

Razor Konvence stránek se přidávají a konfiguruje pomocí metody rozšíření pro v AddRazorPagesOptions kolekci služby ve třídě AddMvc Startup . Následující příklady konvencí jsou vysvětleny dále v tomto tématu:

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( ... );
        });
}

Pořadí tras

Trasy určují pro Order zpracování (párování tras).

Objednávka Chování
-1 Trasa se zpracuje před zpracováním dalších tras.
0 Order (Objednávka) není zadaná (výchozí hodnota). Při nepřiřazování ( ) se jako výchozí trasa pro zpracování přiřadí Order Order = null hodnota Order 0 (nula).
1, 2, … n Určuje pořadí zpracování tras.

Zpracování tras se stanoví podle konvence:

  • Trasy se zpracovávají v sekvenčním pořadí (-1, 0, 1, 2, … n).
  • Pokud trasy mají stejnou shodu, nejvíce konkrétní trasa se nejprve porovná s méně Order specifickými trasami.
  • Pokud trasy se stejným počtem parametrů odpovídají adrese URL požadavku, trasy se zpracují v pořadí, ve které se Order přidávají do PageConventionCollection .

Pokud je to možné, vyhněte se v závislosti na stanoveném pořadí zpracování tras. Směrování obecně vybírá správnou trasu s odpovídající adresou URL. Pokud musíte nastavit vlastnosti trasy tak, aby směrovat požadavky správně, schéma směrování aplikace je pravděpodobně matoucí pro klienty a údržba Order je nepřehledná. Hledejte zjednodušení schématu směrování aplikace. Ukázková aplikace vyžaduje explicitní pořadí zpracování tras, aby bylo možné pomocí jedné aplikace předvést několik scénářů směrování. Měli byste se ale pokusit vyhnout postupu nastavení trasy v Order produkčních aplikacích.

Razor Směrování stránek a směrování kontroleru MVC sdílejí implementaci. Informace o pořadí tras v tématech o MVC jsou k dispozici v tématu Směrování na akce kontroleru: Řazení tras atributů.

Modelové konvence

Přidejte delegáta pro IPageConvention , který přidá konvence modelu, které platí pro Razor Pages.

Přidání konvence modelu tras na všechny stránky

Slouží k vytvoření a přidání do kolekce instancí, které jsou Conventions použity během vytváření modelu trasy IPageRouteModelConvention IPageConvention stránky.

Ukázková aplikace přidá {globalTemplate?} šablonu trasy na všechny stránky v aplikaci:

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?}"),
                }
            });
        }
    }
}

Vlastnost Order objektu je AttributeRouteModel nastavená na 1 . Tím se zajistí následující chování při porovnávání tras v ukázkové aplikaci:

  • Šablona trasy pro TheContactPage/{text?} se přidá později v tématu. Trasa Kontaktní stránka má výchozí pořadí ( ), takže se shoduje před null Order = 0 {globalTemplate?} šablonou trasy.
  • Šablona {aboutTemplate?} trasy se přidá později v tématu. Šablona {aboutTemplate?} má parametr Order 2 . Při vyžádání stránky O službě se kvůli nastavení vlastnosti načte hodnota RouteDataValue do ( ) a ne /About/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["aboutTemplate"] Order = 2 Order ).
  • Šablona {otherPagesTemplate?} trasy se přidá později v tématu. Šablona {otherPagesTemplate?} má parametr Order 2 . Pokud se kvůli nastavení vlastnosti požaduje jakákoli stránka ve složce Pages/OtherPages s parametrem trasy (například ), načte se routeDataValue do ( ) a ne /OtherPages/Page1/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["otherPagesTemplate"] Order = 2 Order ).

Všude, kde je to možné, nastavte Order , což má za výsledek Order = 0 . Při výběru správné trasy se spoléhejte na směrování.

Razor Možnosti stránek, například přidání , se při přidání MVC do kolekce služby v Conventions Startup.ConfigureServices přidávají. Příklad najdete v ukázkové aplikaci.

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

Vyžádejte si stránku o ukázce na adrese a localhost:5000/About/GlobalRouteValue prohlédněte si výsledek:

Stránka O službě se požaduje se segmentem trasy GlobalRouteValue. Vykreslená stránka ukazuje, že hodnota dat trasy je zachycena v metodě OnGet stránky.

Přidání konvence modelu aplikace na všechny stránky

Slouží k vytvoření a přidání do kolekce instancí, které jsou Conventions použity během vytváření modelu aplikace IPageApplicationModelConvention IPageConvention stránky.

K předvedení této a dalších konvencí dále v tomto tématu obsahuje ukázková aplikace AddHeaderAttribute třídu . Konstruktor třídy přijímá řetězec name a values pole řetězců. Tyto hodnoty se ve své OnResultExecuting metodě používají k nastavení hlavičky odpovědi. Úplná třída je uvedena v části Konvence akcí modelu stránky dále v tématu.

Ukázková aplikace používá AddHeaderAttribute třídu k přidání hlavičky na všechny stránky GlobalHeader v aplikaci:

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());

Vyžádejte si stránku o ukázce na adrese a zkontrolujte localhost:5000/About hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi na stránce O službě ukazují, že byl přidán hlavička GlobalHeader.

Přidání konvence modelu obslužné rutiny na všechny stránky

Slouží k vytvoření a přidání do kolekce instancí, které jsou použity během vytváření modelu Conventions IPageHandlerModelConvention obslužné rutiny IPageConvention stránky.

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

Startup.cs:

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

Konvence akcí směrování stránek

Výchozí poskytovatel modelu směrování odvozený z vyvolává konvence, které jsou navrženy tak, aby poskytovaly body rozšiřitelnosti pro IPageRouteModelProvider konfiguraci tras stránek.

Konvence modelu směrování složek

Slouží k vytvoření a přidání , která vyvolá akci na pro všechny stránky AddFolderRouteModelConvention IPageRouteModelConvention v zadané PageRouteModel složce.

Ukázková aplikace používá AddFolderRouteModelConvention k přidání šablony trasy na stránky ve {otherPagesTemplate?} složce 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?}"),
            }
        });
    }
});

Vlastnost Order objektu je AttributeRouteModel nastavená na 2 . Tím se zajistí, že šablona pro (nastavená dříve v tématu na ) bude mít prioritu pro první pozici hodnoty dat trasy, když je zadaná {globalTemplate?} 1 jedna hodnota trasy. Pokud se kvůli nastavení vlastnosti vyžádá stránka ve složce Pages/OtherPages s hodnotou parametru trasy (například ), načte se RouteDataValue do ( ) a ne /OtherPages/Page1/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["otherPagesTemplate"] Order = 2 Order ).

Všude, kde je to možné, nastavte Order , což má za výsledek Order = 0 . Při výběru správné trasy se spoléhejte na směrování.

Vyžádejte si stránku Page1 ukázky na adrese a localhost:5000/OtherPages/Page1/GlobalRouteValue/OtherPagesRouteValue zkontrolujte výsledek:

Stránka Page1 ve složce OtherPages se požaduje se segmentem trasy GlobalRouteValue a OtherPagesRouteValue. Vykreslená stránka ukazuje, že hodnoty dat tras jsou zachyceny v metodě OnGet stránky.

Konvence modelu směrování stránek

Slouží k vytvoření a přidání , která vyvolá akci na stránce AddPageRouteModelConvention IPageRouteModelConvention se PageRouteModel zadaným názvem.

Ukázková aplikace používá AddPageRouteModelConvention k přidání šablony trasy na stránku O {aboutTemplate?} aplikaci:

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?}"),
            }
        });
    }
});

Vlastnost Order objektu je AttributeRouteModel nastavená na 2 . Tím se zajistí, že šablona pro (nastavená dříve v tématu na ) bude mít prioritu pro první pozici hodnoty dat trasy, když je zadaná {globalTemplate?} 1 jedna hodnota trasy. Pokud se kvůli nastavení vlastnosti vyžádá stránka O službě s parametrem trasy v , načte se hodnota RouteDataValue do ( ) a ne /About/RouteDataValue RouteData.Values["globalTemplate"] ( Order = 1 RouteData.Values["aboutTemplate"] Order = 2 Order ).

Všude, kde je to možné, nastavte Order , což má za výsledek Order = 0 . Při výběru správné trasy se spoléhejte na směrování.

Vyžádejte si stránku o ukázce na adrese a localhost:5000/About/GlobalRouteValue/AboutRouteValue prohlédněte si výsledek:

O stránce se požaduje segmenty tras pro GlobalRouteValue a AboutRouteValue. Vykreslená stránka ukazuje, že hodnoty dat tras jsou zachyceny v metodě OnGet stránky.

Konfigurace trasy stránky

Slouží AddPageRoute ke konfiguraci trasy na stránku v zadané cestě stránky. Vygenerované odkazy na stránku používají zadanou trasu. AddPageRoute používá AddPageRouteModelConvention k vytvoření trasy.

Ukázková aplikace vytvoří trasu pro /TheContactPage Contact.cshtml:

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

Stránka Kontakt je také přístupná /Contact přes výchozí trasu.

Vlastní trasa ukázkové aplikace na stránku Kontakt umožňuje volitelný text segment trasy ( {text?} ). Stránka také obsahuje tento volitelný segment ve své direktivě pro případ, že návštěvník přistupuje @page na stránku na své /Contact trase:

@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>

Všimněte si, že adresa URL vygenerovaná pro odkaz Kontakt na vykreslené stránce odráží aktualizovanou trasu:

Odkaz kontaktu ukázkové aplikace na navigačním panelu

Kontrola odkazu Contact ve vykreslené html značí, že je href nastavený na /TheContactPage.

Navštivte stránku Kontakt na běžné trase /Contact nebo na vlastní trase /TheContactPage . Pokud zadáte další segment trasy, na stránce se zobrazí segment s kódováním text HTML, který poskytnete:

Příklad prohlížeče Edge, který v adrese URL poskytuje volitelný segment trasy TextValue. Vykreslená stránka zobrazuje hodnotu segmentu text.

Konvence akcí modelu stránek

Výchozí poskytovatel modelu stránky, který implementuje, vyvolá konvence, které jsou navržené tak, aby poskytovaly body rozšiřitelnosti pro IPageApplicationModelProvider konfiguraci modelů stránek. Tyto konvence jsou užitečné při vytváření a úpravách scénářů zjišťování a zpracování stránek.

Pro příklady v této části používá ukázková aplikace třídu , což je třída , která používá AddHeaderAttribute ResultFilterAttribute hlavičku odpovědi:

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);
    }
}

Pomocí konvencí ukázka ukazuje, jak použít atribut na všechny stránky ve složce a na jednu stránku.

Konvence modelu aplikace složek

Slouží k vytvoření a přidání , která vyvolá akci na AddFolderApplicationModelConvention IPageApplicationModelConvention PageApplicationModel instancích pro všechny stránky v zadané složce.

Ukázka demonstruje použití přidáním hlavičky na stránky ve složce AddFolderApplicationModelConvention OtherPagesHeader OtherPages aplikace:

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

Vyžádejte si stránku Page1 ukázky na adrese a zkontrolujte localhost:5000/OtherPages/Page1 hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi stránky OtherPages/Page1 ukazují, že byl přidán hlavička OtherPagesHeader.

Konvence modelu stránkové aplikace

Slouží k vytvoření a přidání , která vyvolá akci na stránce AddPageApplicationModelConvention IPageApplicationModelConvention se PageApplicationModel zadaným názvem.

Ukázka demonstruje použití AddPageApplicationModelConvention přidáním hlavičky AboutHeader na stránku O službě:

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

Vyžádejte si stránku o ukázce na adrese a zkontrolujte localhost:5000/About hlavičky, abyste si výsledek prohlédněte:

Hlavičky odpovědi na stránce About ukazují, že byl přidán hlavička AboutHeader.

Konfigurace filtru

ConfigureFilter nakonfiguruje zadaný filtr na použití. Můžete implementovat třídu filtru, ale ukázková aplikace ukazuje, jak implementovat filtr ve výrazu lambda, který je implementován na pozadí jako objekt pro vytváření, který vrací filtr:

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

Model aplikace stránky slouží ke kontrole relativní cesty pro segmenty, které vedou na stránku Page2 ve složce OtherPages. Pokud podmínka projde, přidá se hlavička. Pokud ne, EmptyFilter použije se .

EmptyFilter je filtr akce. Vzhledem k tomu, že filtry akcí jsou stránkami ignorovány, nemá objekt žádný zamýšlený účinek, pokud Razor EmptyFilter cesta neobsahuje OtherPages/Page2 .

Vyžádejte si stránku Page2 ukázky na adrese a zkontrolujte localhost:5000/OtherPages/Page2 hlavičky, abyste si výsledek prohlédněte:

Do odpovědi pro Page2 se přidá Hlavička OtherPagesPage2Header.

Konfigurace objekt pro vytváření filtrů

ConfigureFilter nakonfiguruje zadanou továrnu na použití filtrů na všechny Razor stránky.

Ukázková aplikace nabízí příklad použití objektu pro vytváření filtrů přidáním hlavičky se dvěma hodnotami na FilterFactoryHeader stránky aplikace:

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;
        }
    }
}

Požádejte o stránku ukázek o stránce localhost:5000/About a Prohlédněte si záhlaví a podívejte se na výsledek:

Hlavičky odpovědi stránky o stránku zobrazují, že byly přidány dvě hlavičky FilterFactoryHeader.

Filtry MVC a filtr stránky (IPageFilter)

Filtry akcí MVC jsou stránky ignorovány Razor , protože Razor stránky používají metody obslužné rutiny. Další typy filtrů MVC jsou k dispozici pro použití: autorizace, výjimka, prostředeka výsledek. Další informace najdete v tématu filtry .

Filtr stránky ( IPageFilter ) je filtr, který se vztahuje na Razor stránky. Další informace najdete v tématu metody filtrování pro Razor stránky.

Další materiály