Convenciones de aplicación y de ruta de páginas de Razor en ASP.NET CoreRazor Pages route and app conventions in ASP.NET Core

Por Luke LathamBy Luke Latham

Aquí encontrará información para saber cómo usar las convenciones de proveedor de modelos de aplicación y de ruta con objeto de controlar el enrutamiento, la detección y el procesamiento en aplicaciones de páginas de Razor.Learn how to use page route and app model provider conventions to control page routing, discovery, and processing in Razor Pages apps.

Si necesita configurar rutas de una página personalizadas para páginas concretas, configure el enrutamiento a esas páginas con la convención AddPageRoute, descrita más adelante en este tema.When you need to configure custom page routes for individual pages, configure routing to pages with the AddPageRoute convention described later in this topic.

Para especificar una ruta de página, agregar segmentos de ruta o agregar parámetros a una ruta, use la directiva @page de la página.To specify a page route, add route segments, or add parameters to a route, use the page's @page directive. Para obtener más información, vea rutas personalizadas.For more information, see Custom routes.

Hay palabras reservadas que no se pueden usar como segmentos de ruta o nombres de parámetro.There are reserved words that can't be used as route segments or parameter names. Para obtener más información, consulte enrutamiento: Nombresde enrutamiento reservados.For more information, see Routing: Reserved routing names.

Vea o descargue el código de ejemplo (cómo descargarlo)View or download sample code (how to download)

EscenarioScenario El ejemplo explica cómo...The sample demonstrates ...
Convenciones de modeloModel conventions

Conventions.AddConventions.Add
  • IPageRouteModelConventionIPageRouteModelConvention
  • IPageApplicationModelConventionIPageApplicationModelConvention
  • IPageHandlerModelConventionIPageHandlerModelConvention
Agregar un encabezado y una plantilla de ruta a las páginas de una aplicación.Add a route template and header to an app's pages.
Convenciones de acción de ruta de páginaPage route action conventions
  • AddFolderRouteModelConventionAddFolderRouteModelConvention
  • AddPageRouteModelConventionAddPageRouteModelConvention
  • AddPageRouteAddPageRoute
Agregar una plantilla de ruta a las páginas de una carpeta y a una sola página.Add a route template to pages in a folder and to a single page.
Convenciones de acción del modelo de páginaPage model action conventions
  • AddFolderApplicationModelConventionAddFolderApplicationModelConvention
  • AddPageApplicationModelConventionAddPageApplicationModelConvention
  • ConfigureFilter (clase de filtro, expresión lambda o fábrica de filtros)ConfigureFilter (filter class, lambda expression, or filter factory)
Agregar un encabezado a las páginas de una carpeta, agregar un encabezado a una sola página y configurar una fábrica de filtros para agregar un encabezado a las páginas de la aplicación.Add a header to pages in a folder, add a header to a single page, and configure a filter factory to add a header to an app's pages.

Razor pages convenciones se agregan y configuran mediante AddRazorPagesOptions el AddMvc método de extensión en la colección Startup de servicios de la clase.Razor Pages conventions are added and configured using the AddRazorPagesOptions extension method to AddMvc on the service collection in the Startup class. Más avanzado el tema veremos los siguientes ejemplos de convención:The following convention examples are explained later in this topic:

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

Orden de rutaRoute order

Las rutas especifican un Order para el procesamiento (coincidencia de rutas).Routes specify an Order for processing (route matching).

OrdenarOrder ComportamientoBehavior
-1-1 La ruta se procesa antes de que se procesen otras rutas.The route is processed before other routes are processed.
00 No se ha especificado el orden (valor predeterminado).Order isn't specified (default value). Si no se asigna Order (Order = null), el valor predeterminado Order de la ruta es 0 (cero) para el procesamiento.Not assigning Order (Order = null) defaults the route Order to 0 (zero) for processing.
1, 2, … n1, 2, … n Especifica el orden de procesamiento de la ruta.Specifies the route processing order.

El procesamiento de rutas se establece por Convención:Route processing is established by convention:

  • Las rutas se procesan en orden secuencial (-1, 0, 1, … 2, n).Routes are processed in sequential order (-1, 0, 1, 2, … n).
  • Cuando las rutas tienen el Ordermismo, la ruta más específica se compara primero seguida por rutas menos específicas.When routes have the same Order, the most specific route is matched first followed by less specific routes.
  • Cuando las rutas con el Order mismo número de parámetros coinciden con una dirección URL de solicitud, las rutas se procesan en el orden en que PageConventionCollectionse agregan a.When routes with the same Order and the same number of parameters match a request URL, routes are processed in the order that they're added to the PageConventionCollection.

Si es posible, evite depender de un orden de procesamiento de rutas establecido.If possible, avoid depending on an established route processing order. Por lo general, el enrutamiento selecciona la ruta correcta con coincidencia de dirección URL.Generally, routing selects the correct route with URL matching. Si debe establecer las propiedades Order de ruta para enrutar las solicitudes correctamente, es probable que el esquema de enrutamiento de la aplicación sea confuso para los clientes y que el mantenimiento sea frágil.If you must set route Order properties to route requests correctly, the app's routing scheme is probably confusing to clients and fragile to maintain. Busque para simplificar el esquema de enrutamiento de la aplicación.Seek to simplify the app's routing scheme. La aplicación de ejemplo requiere un orden de procesamiento de rutas explícito para mostrar varios escenarios de enrutamiento con una sola aplicación.The sample app requires an explicit route processing order to demonstrate several routing scenarios using a single app. Sin embargo, debe intentar evitar la práctica de establecer la ruta Order en las aplicaciones de producción.However, you should attempt to avoid the practice of setting route Order in production apps.

El enrutamiento del controlador de MVC y el enrutamiento de Razor Pages comparten una implementación.Razor Pages routing and MVC controller routing share an implementation. La información sobre el orden de las rutas en los temas de MVC está disponible en enrutamiento a las acciones del controlador: Ordenar rutasde atributo.Information on route order in the MVC topics is available at Routing to controller actions: Ordering attribute routes.

Convenciones de modeloModel conventions

Agregue un delegado para IPageConvention para agregar convenciones de modelo que se aplican a Razor pages.Add a delegate for IPageConvention to add model conventions that apply to Razor Pages.

Agregar una Convención de modelo de ruta a todas las páginasAdd a route model convention to all pages

Utilice Conventions para crear y IPageRouteModelConvention agregar a la colección de instancias IPageConvention de que se aplican durante la construcción del modelo de ruta de página.Use Conventions to create and add an IPageRouteModelConvention to the collection of IPageConvention instances that are applied during page route model construction.

En la aplicación de ejemplo se agrega una plantilla de ruta {globalTemplate?} a todas las páginas de la aplicación:The sample app adds a {globalTemplate?} route template to all of the pages in the app:

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

La propiedad Order de AttributeRouteModel está establecida en 1.The Order property for the AttributeRouteModel is set to 1. Esto garantiza el siguiente comportamiento de coincidencia de rutas en la aplicación de ejemplo:This ensures the following route matching behavior in the sample app:

  • Más adelante en el TheContactPage/{text?} tema se agrega una plantilla de ruta para.A route template for TheContactPage/{text?} is added later in the topic. La ruta de la página de contacto tiene un null ordenOrder = 0predeterminado de (), por lo {globalTemplate?} que coincide antes de la plantilla de ruta.The Contact Page route has a default order of null (Order = 0), so it matches before the {globalTemplate?} route template.
  • Más {aboutTemplate?} adelante en el tema se agrega una plantilla de ruta.An {aboutTemplate?} route template is added later in the topic. La plantilla {aboutTemplate?} tiene un Order con un valor de 2.The {aboutTemplate?} template is given an Order of 2. Cuando la página About se solicita en /About/RouteDataValue, "RouteDataValue" se carga en RouteData.Values["globalTemplate"] (Order = 1) y no RouteData.Values["aboutTemplate"] (Order = 2), debido a la configuración de la propiedad Order.When the About page is requested at /About/RouteDataValue, "RouteDataValue" is loaded into RouteData.Values["globalTemplate"] (Order = 1) and not RouteData.Values["aboutTemplate"] (Order = 2) due to setting the Order property.
  • Más {otherPagesTemplate?} adelante en el tema se agrega una plantilla de ruta.An {otherPagesTemplate?} route template is added later in the topic. La plantilla {otherPagesTemplate?} tiene un Order con un valor de 2.The {otherPagesTemplate?} template is given an Order of 2. Cuando se solicita una página de la carpeta pages/OtherPages con un parámetro de ruta (por /OtherPages/Page1/RouteDataValueejemplo,), "RouteDataValue" se RouteData.Values["globalTemplate"] cargaOrder = 1en () RouteData.Values["otherPagesTemplate"] yOrder = 2no () debido a la configuración del parámetroOrder propiedad.When any page in the Pages/OtherPages folder is requested with a route parameter (for example, /OtherPages/Page1/RouteDataValue), "RouteDataValue" is loaded into RouteData.Values["globalTemplate"] (Order = 1) and not RouteData.Values["otherPagesTemplate"] (Order = 2) due to setting the Order property.

Siempre que sea posible, no Orderestablezca, lo que Order = 0da como resultado.Wherever possible, don't set the Order, which results in Order = 0. Confíe en el enrutamiento para seleccionar la ruta correcta.Rely on routing to select the correct route.

Razor pages opciones, como agregar Conventions, se agregan cuando MVC se agrega a la colección de servicios en. Startup.ConfigureServicesRazor Pages options, such as adding Conventions, are added when MVC is added to the service collection in Startup.ConfigureServices. Para obtener un ejemplo, vea la aplicación de ejemplo.For an example, see the sample app.

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

Solicite la página About del ejemplo en localhost:5000/About/GlobalRouteValue y revise el resultado:Request the sample's About page at localhost:5000/About/GlobalRouteValue and inspect the result:

La página About se solicita con un segmento de ruta de GlobalRouteValue.

Agregar una Convención de modelo de aplicación a todas las páginasAdd an app model convention to all pages

Use Conventions para crear y agregar un IPageApplicationModelConvention a la colección de IPageConvention instancias de que se aplican durante la construcción del modelo de aplicación de página.Use Conventions to create and add an IPageApplicationModelConvention to the collection of IPageConvention instances that are applied during page app model construction.

Para demostrar esta y otras convenciones más adelante en este tema, la aplicación de ejemplo incluye una clase AddHeaderAttribute.To demonstrate this and other conventions later in the topic, the sample app includes an AddHeaderAttribute class. El constructor de esta clase acepta una cadena name y una matriz de cadenas values.The class constructor accepts a name string and a values string array. Estos valores se usan en su método OnResultExecuting para establecer un encabezado de respuesta.These values are used in its OnResultExecuting method to set a response header. La clase completa se muestra en la sección Convenciones de acción del modelo de página más adelante en este tema.The full class is shown in the Page model action conventions section later in the topic.

En la aplicación de ejemplo se usa la clase AddHeaderAttribute para agregar un encabezado (GlobalHeader) a todas las páginas de la aplicación:The sample app uses the AddHeaderAttribute class to add a header, GlobalHeader, to all of the pages in the app:

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

Startup.cs:Startup.cs:

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

Solicite la página About del ejemplo en localhost:5000/About y revise los encabezados para ver el resultado:Request the sample's About page at localhost:5000/About and inspect the headers to view the result:

Los encabezados de respuesta de la página About ponen de manifiesto que GlobalHeader se ha agregado.

Agregar una Convención de modelo de controlador a todas las páginasAdd a handler model convention to all pages

Utilice Conventions para crear y IPageHandlerModelConvention agregar a la colección de instancias IPageConvention de que se aplican durante la construcción del modelo de controlador de páginas.Use Conventions to create and add an IPageHandlerModelConvention to the collection of IPageConvention instances that are applied during page handler model construction.

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

Startup.cs:Startup.cs:

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

Convenciones de acción de ruta de páginaPage route action conventions

El proveedor de modelos de ruta predeterminado que deriva IPageRouteModelProvider de las convenciones de invocaciones que están diseñadas para proporcionar puntos de extensibilidad para configurar rutas de página.The default route model provider that derives from IPageRouteModelProvider invokes conventions which are designed to provide extensibility points for configuring page routes.

Convención de modelo de ruta de carpetaFolder route model convention

Utilice AddFolderRouteModelConvention para crear y agregar un IPageRouteModelConvention que invoca una acción en PageRouteModel para todas las páginas de la carpeta especificada.Use AddFolderRouteModelConvention to create and add an IPageRouteModelConvention that invokes an action on the PageRouteModel for all of the pages under the specified folder.

En la aplicación de ejemplo se usa AddFolderRouteModelConvention para agregar una plantilla de ruta {otherPagesTemplate?} a las páginas de la carpeta OtherPages:The sample app uses AddFolderRouteModelConvention to add an {otherPagesTemplate?} route template to the pages in the OtherPages folder:

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

La propiedad Order de AttributeRouteModel está establecida en 2.The Order property for the AttributeRouteModel is set to 2. Esto garantiza que la plantilla para {globalTemplate?} (establecida anteriormente en el tema a 1) tiene prioridad para la primera posición de valor de datos de ruta cuando se proporciona un valor de ruta único.This ensures that the template for {globalTemplate?} (set earlier in the topic to 1) is given priority for the first route data value position when a single route value is provided. Si se solicita una página de la carpeta pages/OtherPages con un valor de parámetro de ruta ( /OtherPages/Page1/RouteDataValuepor ejemplo,), "RouteDataValue" RouteData.Values["globalTemplate"] seOrder = 1carga en ( RouteData.Values["otherPagesTemplate"] )Order = 2y no () debido a la configuración de la Order propiedad.If a page in the Pages/OtherPages folder is requested with a route parameter value (for example, /OtherPages/Page1/RouteDataValue), "RouteDataValue" is loaded into RouteData.Values["globalTemplate"] (Order = 1) and not RouteData.Values["otherPagesTemplate"] (Order = 2) due to setting the Order property.

Siempre que sea posible, no Orderestablezca, lo que Order = 0da como resultado.Wherever possible, don't set the Order, which results in Order = 0. Confíe en el enrutamiento para seleccionar la ruta correcta.Rely on routing to select the correct route.

Solicite la página Page1 del ejemplo en localhost:5000/OtherPages/Page1/GlobalRouteValue/OtherPagesRouteValue y revise el resultado:Request the sample's Page1 page at localhost:5000/OtherPages/Page1/GlobalRouteValue/OtherPagesRouteValue and inspect the result:

Page1 en la carpeta OtherPages solicitada con un segmento de ruta de GlobalRouteValue y OtherPagesRouteValue

Convención de modelo de ruta de páginaPage route model convention

Utilice AddPageRouteModelConvention para crear y agregar un IPageRouteModelConvention que invoca una acción en PageRouteModel para la página con el nombre especificado.Use AddPageRouteModelConvention to create and add an IPageRouteModelConvention that invokes an action on the PageRouteModel for the page with the specified name.

En la aplicación de ejemplo se usa AddPageRouteModelConvention para agregar una plantilla de ruta {aboutTemplate?} a la página About:The sample app uses AddPageRouteModelConvention to add an {aboutTemplate?} route template to the About page:

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

La propiedad Order de AttributeRouteModel está establecida en 2.The Order property for the AttributeRouteModel is set to 2. Esto garantiza que la plantilla para {globalTemplate?} (establecida anteriormente en el tema a 1) tiene prioridad para la primera posición de valor de datos de ruta cuando se proporciona un valor de ruta único.This ensures that the template for {globalTemplate?} (set earlier in the topic to 1) is given priority for the first route data value position when a single route value is provided. Si la página about se solicita con un valor de parámetro de /About/RouteDataValueruta en, "RouteDataValue" se RouteData.Values["globalTemplate"] cargaOrder = 1en () RouteData.Values["aboutTemplate"] yOrder = 2no () debido a Order la configuración de la propiedad.If the About page is requested with a route parameter value at /About/RouteDataValue, "RouteDataValue" is loaded into RouteData.Values["globalTemplate"] (Order = 1) and not RouteData.Values["aboutTemplate"] (Order = 2) due to setting the Order property.

Siempre que sea posible, no Orderestablezca, lo que Order = 0da como resultado.Wherever possible, don't set the Order, which results in Order = 0. Confíe en el enrutamiento para seleccionar la ruta correcta.Rely on routing to select the correct route.

Solicite la página About del ejemplo en localhost:5000/About/GlobalRouteValue/AboutRouteValue y revise el resultado:Request the sample's About page at localhost:5000/About/GlobalRouteValue/AboutRouteValue and inspect the result:

La página About se solicita con los segmentos de ruta de GlobalRouteValue y AboutRouteValue.

Usar un transformador de parámetros para personalizar las rutas de páginaUse a parameter transformer to customize page routes

Las rutas de página generadas por ASP.NET Core pueden personalizarse mediante un transformador de parámetros.Page routes generated by ASP.NET Core can be customized using a parameter transformer. Un transformador de parámetro implementa IOutboundParameterTransformer y transforma el valor de parámetros.A parameter transformer implements IOutboundParameterTransformer and transforms the value of parameters. Por ejemplo, un transformador de parámetros SlugifyParameterTransformer personalizado cambia el valor de ruta SubscriptionManagement a subscription-management.For example, a custom SlugifyParameterTransformer parameter transformer changes the SubscriptionManagement route value to subscription-management.

La PageRouteTransformerConvention Convención de modelo de ruta de página aplica un transformador de parámetros a los segmentos de nombre de archivo y carpeta de las rutas de página generadas automáticamente en una aplicación.The PageRouteTransformerConvention page route model convention applies a parameter transformer to the folder and file name segments of automatically generated page routes in an app. Por ejemplo, el archivo Razor pages en /pages/SubscriptionManagement/ViewAll.cshtml tendría que volver a escribir su ruta /SubscriptionManagement/ViewAll de /subscription-management/view-allen.For example, the Razor Pages file at /Pages/SubscriptionManagement/ViewAll.cshtml would have its route rewritten from /SubscriptionManagement/ViewAll to /subscription-management/view-all.

PageRouteTransformerConventionsolo transforma los segmentos generados automáticamente de una ruta de página que proceden de la carpeta Razor Pages y el nombre de archivo.PageRouteTransformerConvention only transforms the automatically generated segments of a page route that come from the Razor Pages folder and file name. No transforma segmentos de ruta agregados con @page la Directiva.It doesn't transform route segments added with the @page directive. La Convención tampoco transforma las rutas agregadas AddPageRoutepor.The convention also doesn't transform routes added by AddPageRoute.

Se registra como una opción en Startup.ConfigureServices: PageRouteTransformerConventionThe PageRouteTransformerConvention is registered as an option in 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();
    }
}

Configurar una ruta de páginaConfigure a page route

Use AddPageRoute para configurar una ruta a una página en la ruta de acceso de la página especificada.Use AddPageRoute to configure a route to a page at the specified page path. Los vínculos generados que apuntan a esa página usan la ruta especificada.Generated links to the page use your specified route. AddPageRoute usa AddPageRouteModelConvention para establecer la ruta.AddPageRoute uses AddPageRouteModelConvention to establish the route.

En la aplicación de ejemplo se crea una ruta a /TheContactPage para Contact.cshtml:The sample app creates a route to /TheContactPage for Contact.cshtml:

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

A la página Contact también se puede llegar en /Contact a través de su ruta predeterminada.The Contact page can also be reached at /Contact via its default route.

La ruta personalizada de la aplicación de ejemplo que lleva a la página Contact tiene cabida para un segmento de ruta text opcional ({text?}).The sample app's custom route to the Contact page allows for an optional text route segment ({text?}). La página también incluye este segmento opcional en su directiva @page por si el usuario que la visita tiene acceso a la página en su ruta /Contact:The page also includes this optional segment in its @page directive in case the visitor accesses the page at its /Contact route:

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

Observe que la dirección URL generada para el vínculo Contact en la página presentada refleja la ruta actualizada:Note that the URL generated for the Contact link in the rendered page reflects the updated route:

Vínculo Contact de la aplicación de ejemplo en la barra de navegación

Si revisamos el vínculo Contact en el HTML presentado, vemos que href está establecido en "/TheContactPage".

Visite la página Contact a través de su ruta normal, /Contact, o de la ruta personalizada, /TheContactPage.Visit the Contact page at either its ordinary route, /Contact, or the custom route, /TheContactPage. Si se proporciona un segmento de ruta text adicional, la página muestra el segmento codificado en HTML que se ha proporcionado:If you supply an additional text route segment, the page shows the HTML-encoded segment that you provide:

Ejemplo del explorador Microsoft Edge en el que se proporciona un segmento de ruta opcional "text" de "TextValue" en la dirección URL

Convenciones de acción del modelo de páginaPage model action conventions

El proveedor de modelos de página predeterminado que IPageApplicationModelProvider implementa invoca convenciones que están diseñadas para proporcionar puntos de extensibilidad para la configuración de modelos de página.The default page model provider that implements IPageApplicationModelProvider invokes conventions which are designed to provide extensibility points for configuring page models. Estas convenciones son útiles al crear y modificar escenarios de detección y procesamiento de páginas.These conventions are useful when building and modifying page discovery and processing scenarios.

En los ejemplos de esta sección, la aplicación de ejemplo usa AddHeaderAttribute una clase, que es ResultFilterAttributeun, que aplica un encabezado de respuesta:For the examples in this section, the sample app uses an AddHeaderAttribute class, which is a ResultFilterAttribute, that applies a response header:

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

Si empleamos convenciones, el ejemplo indica cómo aplicar el atributo a todas las páginas de una carpeta y a una sola página.Using conventions, the sample demonstrates how to apply the attribute to all of the pages in a folder and to a single page.

Convención de modelo de aplicación de carpetaFolder app model convention

Utilice AddFolderApplicationModelConvention para crear y agregar un IPageApplicationModelConvention que invoca una acción en PageApplicationModel las instancias de para todas las páginas de la carpeta especificada.Use AddFolderApplicationModelConvention to create and add an IPageApplicationModelConvention that invokes an action on PageApplicationModel instances for all pages under the specified folder.

En el ejemplo se demuestra el uso de AddFolderApplicationModelConvention agregando un encabezado (OtherPagesHeader) a las páginas de la carpeta OtherPages de la aplicación:The sample demonstrates the use of AddFolderApplicationModelConvention by adding a header, OtherPagesHeader, to the pages inside the OtherPages folder of the app:

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

Solicite la página Page1 del ejemplo en localhost:5000/OtherPages/Page1 y revise los encabezados para ver el resultado:Request the sample's Page1 page at localhost:5000/OtherPages/Page1 and inspect the headers to view the result:

Los encabezados de respuesta de la página OtherPages/Page1 ponen de manifiesto que OtherPagesHeader se ha agregado.

Convención de modelo de aplicación de páginaPage app model convention

Utilice AddPageApplicationModelConvention para crear y agregar un IPageApplicationModelConvention que invoca una acción en PageApplicationModel para la página con el nombre especificado.Use AddPageApplicationModelConvention to create and add an IPageApplicationModelConvention that invokes an action on the PageApplicationModel for the page with the specified name.

En el ejemplo se demuestra el uso de AddPageApplicationModelConvention agregando un encabezado (AboutHeader) a la página About:The sample demonstrates the use of AddPageApplicationModelConvention by adding a header, AboutHeader, to the About page:

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

Solicite la página About del ejemplo en localhost:5000/About y revise los encabezados para ver el resultado:Request the sample's About page at localhost:5000/About and inspect the headers to view the result:

Los encabezados de respuesta de la página About ponen de manifiesto que AboutHeader se ha agregado.

Configurar un filtroConfigure a filter

ConfigureFilterconfigura el filtro especificado que se va a aplicar.ConfigureFilter configures the specified filter to apply. Se puede implementar una clase de filtro, pero en la aplicación de ejemplo se muestra cómo implementar un filtro en una expresión lambda, cosa que sucede en segundo plano como una fábrica que devuelve un filtro:You can implement a filter class, but the sample app shows how to implement a filter in a lambda expression, which is implemented behind-the-scenes as a factory that returns a filter:

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

El modelo de páginas de aplicación se usa para comprobar la ruta de acceso relativa de los segmentos que conducen a la página Page2 en la carpeta OtherPages.The page app model is used to check the relative path for segments that lead to the Page2 page in the OtherPages folder. Si la condición se supera, se agrega un encabezado.If the condition passes, a header is added. Si no, se aplica EmptyFilter.If not, the EmptyFilter is applied.

EmptyFilter es un filtro de acciones.EmptyFilter is an Action filter. Dado que Razor pages omite los filtros de acción, EmptyFilter el no tiene ningún efecto según lo previsto si la OtherPages/Page2ruta de acceso no contiene.Since Action filters are ignored by Razor Pages, the EmptyFilter has no effect as intended if the path doesn't contain OtherPages/Page2.

Solicite la página Page2 del ejemplo en localhost:5000/OtherPages/Page2 y revise los encabezados para ver el resultado:Request the sample's Page2 page at localhost:5000/OtherPages/Page2 and inspect the headers to view the result:

OtherPagesPage2Header se agrega a la respuesta de Page2.

Configurar una fábrica de filtrosConfigure a filter factory

ConfigureFilterconfigura el generador especificado para aplicar filtros a todos los Razor pages.ConfigureFilter configures the specified factory to apply filters to all Razor Pages.

En la aplicación de ejemplo se proporciona un ejemplo del uso de una fábrica de filtros, para lo cual se agrega un encabezado (FilterFactoryHeader) con dos valores a las páginas de la aplicación:The sample app provides an example of using a filter factory by adding a header, FilterFactoryHeader, with two values to the app's pages:

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

AddHeaderWithFactory.cs: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;
        }
    }
}
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;
        }
    }
}

Solicite la página About del ejemplo en localhost:5000/About y revise los encabezados para ver el resultado:Request the sample's About page at localhost:5000/About and inspect the headers to view the result:

Los encabezados de respuesta de la página About ponen de manifiesto que se han agregado dos encabezados FilterFactoryHeader.

Filtros de MVC y filtro de página (IPageFilter)MVC Filters and the Page filter (IPageFilter)

Las páginas de Razor no tienen en cuenta los filtros de acciones de MVC, porque en este tipo de páginas se usan métodos de control.MVC Action filters are ignored by Razor Pages, since Razor Pages use handler methods. Otros tipos de filtros MVC están disponibles para su uso: Autorización, excepción, recursoy resultado.Other types of MVC filters are available for you to use: Authorization, Exception, Resource, and Result. Para más información, vea el tema Filters (Filtros).For more information, see the Filters topic.

El filtro de páginaIPageFilter() es un filtro que se aplica a Razor pages.The Page filter (IPageFilter) is a filter that applies to Razor Pages. Para más información, vea Filter methods for Razor Pages (Métodos de filtrado para páginas de Razor).For more information, see Filter methods for Razor Pages.

Recursos adicionalesAdditional resources