RazorASP.NET Core sayfaların filtre yöntemleri
Gönderen Rick Anderson
Razor Sayfa filtreleri ıpagefilter ve ıasyncpagefilter Razor sayfaların bir sayfa işleyicisi çalıştırılmadan önce ve sonra kod çalıştırmasına izin verir Razor . Razorsayfa filtreleri, tek sayfa işleyicisi yöntemlerine uygulanamazlar hariç ASP.NET Core MVC eylem filtrelerinebenzerdir.
Razor Sayfa filtreleri:
- Bir işleyici yöntemi seçildikten sonra, ancak model bağlama gerçekleşmeden önce kodu çalıştırın.
- Model bağlama işlemi tamamlandıktan sonra işleyici metodu yürütülmeden önce kodu çalıştırın.
- İşleyici yöntemi yürütüldükten sonra kodu çalıştırın.
- , Bir sayfada veya genel olarak uygulanabilir.
- Belirli sayfa işleyici yöntemlerine uygulanamaz.
- , Bağımlılık ekleme (dı) tarafından doldurulmuş Oluşturucu bağımlılıkları olabilir. Daha fazla bilgi için bkz. Servicefilterattribute ve typefilterattribute.
Sayfa oluşturucular ve ara yazılım, bir işleyici yöntemi yürütmeden önce özel kod yürütmeyi etkinleştirirken, yalnızca Razor sayfa filtreleri HttpContext ve sayfasına erişimi etkinleştirir. Ara yazılım, HttpContext "sayfa bağlamına" değil, öğesine erişebilir. Filtrelerin FilterContext , öğesine erişim sağlayan bir türetilmiş parametresi vardır HttpContext . Sayfa filtresi için bir örnek aşağıda verilmiştir: yanıta bir üst bilgi ekleyen bir filtre özniteliği uygulama , oluşturucular veya ara yazılım ile gerçekleştirilemez. Sayfa bağlamına erişim, sayfanın ve bu modelin modeline erişimi içerir, yalnızca filtreler, işleyiciler veya bir sayfanın gövdesi çalıştırılırken kullanılabilir Razor .
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Razor Sayfa filtreleri, genel olarak veya sayfa düzeyinde uygulanabilecek aşağıdaki yöntemleri sağlar:
Zaman uyumlu Yöntemler:
- Onpagehandlerselected : bir işleyici yöntemi seçildikten sonra, ancak model bağlama gerçekleşmeden önce çağırılır.
- Onpagehandlerexecuting : Işleyici Yöntemi yürütülmeden önce çağırılır, model bağlama işlemi tamamlandıktan sonra.
- Onpagehandleryürütüldü : işleyici yöntemi yürütüldükten sonra, eylem sonucundan önce çağırılır.
Zaman uyumsuz yöntemler:
- Onpagehandlerselectionasync : Handler yöntemi seçildikten sonra zaman uyumsuz olarak çağırılır, ancak model bağlama gerçekleşmeden önce.
- Onpagehandlerexecutionasync : Handler yöntemi çağrılmadan önce zaman uyumsuz olarak çağrıldı, model bağlama işlemi tamamlandıktan sonra.
Her ikisini de değil , bir filtre arabiriminin zaman uyumlu veya zaman uyumsuz sürümünü uygulayın. Çerçeve öncelikle filtrenin zaman uyumsuz arabirimi uygulayıp uygulamadığını denetler ve bu durumda bunu çağırır. Aksi takdirde, zaman uyumlu arabirimin Yöntem (ler) i çağırır. Her iki arabirim de uygulanmışsa yalnızca zaman uyumsuz yöntemler çağrılır. Aynı kural sayfalardaki geçersiz kılmalara uygulanır, her ikisine de değil, geçersiz kılmanın zaman uyumlu veya zaman uyumsuz sürümünü uygular.
RazorSayfa filtrelerini küresel olarak Uygula
Aşağıdaki kod şunları uygular IAsyncPageFilter :
public class SampleAsyncPageFilter : IAsyncPageFilter
{
private readonly IConfiguration _config;
public SampleAsyncPageFilter(IConfiguration config)
{
_config = config;
}
public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
{
var key = _config["UserAgentID"];
context.HttpContext.Request.Headers.TryGetValue("user-agent",
out StringValues value);
ProcessUserAgent.Write(context.ActionDescriptor.DisplayName,
"SampleAsyncPageFilter.OnPageHandlerSelectionAsync",
value, key.ToString());
return Task.CompletedTask;
}
public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context,
PageHandlerExecutionDelegate next)
{
// Do post work.
await next.Invoke();
}
}
Yukarıdaki kodda, Kullanıcı ProcessUserAgent.Write Aracı dizesiyle birlikte çalışarak Kullanıcı tarafından sağlanan koddur.
Aşağıdaki kod, sınıfında şunları sunar SampleAsyncPageFilter Startup :
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddMvcOptions(options =>
{
options.Filters.Add(new SampleAsyncPageFilter(Configuration));
});
}
Aşağıdaki kod AddFolderApplicationModelConvention , SampleAsyncPageFilter yalnızca /filmlerde bulunan sayfalara uygulamak için çağırır:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages(options =>
{
options.Conventions.AddFolderApplicationModelConvention(
"/Movies",
model => model.Filters.Add(new SampleAsyncPageFilter(Configuration)));
});
}
Aşağıdaki kod zaman uyumlu olarak uygular IPageFilter :
public class SamplePageFilter : IPageFilter
{
private readonly IConfiguration _config;
public SamplePageFilter(IConfiguration config)
{
_config = config;
}
public void OnPageHandlerSelected(PageHandlerSelectedContext context)
{
var key = _config["UserAgentID"];
context.HttpContext.Request.Headers.TryGetValue("user-agent", out StringValues value);
ProcessUserAgent.Write(context.ActionDescriptor.DisplayName,
"SamplePageFilter.OnPageHandlerSelected",
value, key.ToString());
}
public void OnPageHandlerExecuting(PageHandlerExecutingContext context)
{
Debug.WriteLine("Global sync OnPageHandlerExecuting called.");
}
public void OnPageHandlerExecuted(PageHandlerExecutedContext context)
{
Debug.WriteLine("Global sync OnPageHandlerExecuted called.");
}
}
Aşağıdaki kod şunları sunar SamplePageFilter :
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddMvcOptions(options =>
{
options.Filters.Add(new SamplePageFilter(Configuration));
});
}
RazorFiltre yöntemlerini geçersiz kılarak sayfa filtrelerini uygulama
Aşağıdaki kod, zaman uyumsuz Razor sayfa filtrelerini geçersiz kılar:
public class IndexModel : PageModel
{
private readonly IConfiguration _config;
public IndexModel(IConfiguration config)
{
_config = config;
}
public override Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
{
Debug.WriteLine("/IndexModel OnPageHandlerSelectionAsync");
return Task.CompletedTask;
}
public async override Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context,
PageHandlerExecutionDelegate next)
{
var key = _config["UserAgentID"];
context.HttpContext.Request.Headers.TryGetValue("user-agent", out StringValues value);
ProcessUserAgent.Write(context.ActionDescriptor.DisplayName,
"/IndexModel-OnPageHandlerExecutionAsync",
value, key.ToString());
await next.Invoke();
}
}
Filtre özniteliği uygulama
Yerleşik öznitelik tabanlı filtre filtresi, alt OnResultExecutionAsync sınıflı olabilir. Aşağıdaki filtre yanıta bir üst bilgi ekler:
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Filters;
namespace PageFilter.Filters
{
public class AddHeaderAttribute : ResultFilterAttribute
{
private readonly string _name;
private readonly string _value;
public AddHeaderAttribute (string name, string value)
{
_name = name;
_value = value;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
context.HttpContext.Response.Headers.Add(_name, new string[] { _value });
}
}
}
Aşağıdaki kod AddHeader özniteliğini uygular:
using Microsoft.AspNetCore.Mvc.RazorPages;
using PageFilter.Filters;
namespace PageFilter.Movies
{
[AddHeader("Author", "Rick")]
public class TestModel : PageModel
{
public void OnGet()
{
}
}
}
Üst bilgileri incelemek için tarayıcı geliştirici araçları gibi bir araç kullanın. Yanıt üst bilgileri altında author: Rick görüntülenir.
Sıralamayı geçersiz kılma yönergeleri için bkz. varsayılan sırayı geçersiz kılma .
Filtre işlem hattının bir filtreden kısa devre dışı olması için bkz. iptal ve kısa devre.
Yetkilendir filtre özniteliği
Yetkilendir özniteliği bir öğesine uygulanabilir PageModel :
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace PageFilter.Pages
{
[Authorize]
public class ModelWithAuthFilterModel : PageModel
{
public IActionResult OnGet() => Page();
}
}
Gönderen Rick Anderson
Razor Sayfa filtreleri ıpagefilter ve ıasyncpagefilter Razor sayfaların bir sayfa işleyicisi çalıştırılmadan önce ve sonra kod çalıştırmasına izin verir Razor . Razorsayfa filtreleri, tek sayfa işleyicisi yöntemlerine uygulanamazlar hariç ASP.NET Core MVC eylem filtrelerinebenzerdir.
Razor Sayfa filtreleri:
- Bir işleyici yöntemi seçildikten sonra, ancak model bağlama gerçekleşmeden önce kodu çalıştırın.
- Model bağlama işlemi tamamlandıktan sonra işleyici metodu yürütülmeden önce kodu çalıştırın.
- İşleyici yöntemi yürütüldükten sonra kodu çalıştırın.
- , Bir sayfada veya genel olarak uygulanabilir.
- Belirli sayfa işleyici yöntemlerine uygulanamaz.
Bir işleyici yöntemi sayfa Oluşturucusu veya ara yazılım kullanılarak yürütülmeden önce kod çalıştırılabilir, ancak yalnızca Razor sayfa filtrelerinin HttpContext'e erişimi vardır. Filtrelerin öğesine erişim sağlayan bir Filtercontext türetilmiş parametresi vardır HttpContext . Örneğin, bir filtre uygula özniteliği örneği yanıta, oluşturucular veya ara yazılım ile yapılamadığını belirten bir üst bilgi ekler.
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Razor Sayfa filtreleri, genel olarak veya sayfa düzeyinde uygulanabilecek aşağıdaki yöntemleri sağlar:
Zaman uyumlu Yöntemler:
- Onpagehandlerselected : bir işleyici yöntemi seçildikten sonra, ancak model bağlama gerçekleşmeden önce çağırılır.
- Onpagehandlerexecuting : Işleyici Yöntemi yürütülmeden önce çağırılır, model bağlama işlemi tamamlandıktan sonra.
- Onpagehandleryürütüldü : işleyici yöntemi yürütüldükten sonra, eylem sonucundan önce çağırılır.
Zaman uyumsuz yöntemler:
- Onpagehandlerselectionasync : Handler yöntemi seçildikten sonra zaman uyumsuz olarak çağırılır, ancak model bağlama gerçekleşmeden önce.
- Onpagehandlerexecutionasync : Handler yöntemi çağrılmadan önce zaman uyumsuz olarak çağrıldı, model bağlama işlemi tamamlandıktan sonra.
Not
Her ikisini de değil, bir filtre arabiriminin zaman uyumlu veya zaman uyumsuz sürümünü uygulayın. Çerçeve öncelikle filtrenin zaman uyumsuz arabirimi uygulayıp uygulamadığını denetler ve bu durumda bunu çağırır. Aksi takdirde, zaman uyumlu arabirimin Yöntem (ler) i çağırır. Her iki arabirim de uygulanmışsa yalnızca zaman uyumsuz yöntemler çağrılır. Aynı kural sayfalardaki geçersiz kılmalara uygulanır, her ikisine de değil, geçersiz kılmanın zaman uyumlu veya zaman uyumsuz sürümünü uygular.
RazorSayfa filtrelerini küresel olarak Uygula
Aşağıdaki kod şunları uygular IAsyncPageFilter :
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace PageFilter.Filters
{
public class SampleAsyncPageFilter : IAsyncPageFilter
{
private readonly ILogger _logger;
public SampleAsyncPageFilter(ILogger logger)
{
_logger = logger;
}
public async Task OnPageHandlerSelectionAsync(
PageHandlerSelectedContext context)
{
_logger.LogDebug("Global OnPageHandlerSelectionAsync called.");
await Task.CompletedTask;
}
public async Task OnPageHandlerExecutionAsync(
PageHandlerExecutingContext context,
PageHandlerExecutionDelegate next)
{
_logger.LogDebug("Global OnPageHandlerExecutionAsync called.");
await next.Invoke();
}
}
}
Yukarıdaki kodda, ILogger gerekli değildir. Uygulama için izleme bilgilerini sağlamak üzere örnekte kullanılır.
Aşağıdaki kod, sınıfında şunları sunar SampleAsyncPageFilter Startup :
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(new SampleAsyncPageFilter(_logger));
});
}
Aşağıdaki kod, tüm sınıfı gösterir Startup :
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PageFilter.Filters;
namespace PageFilter
{
public class Startup
{
ILogger _logger;
public Startup(ILoggerFactory loggerFactory, IConfiguration configuration)
{
_logger = loggerFactory.CreateLogger<GlobalFiltersLogger>();
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(new SampleAsyncPageFilter(_logger));
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
}
}
Aşağıdaki kod AddFolderApplicationModelConvention SampleAsyncPageFilter yalnızca /alt klasöründeki sayfalara uygulamak için çağırır:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AddFolderApplicationModelConvention(
"/subFolder",
model => model.Filters.Add(new SampleAsyncPageFilter(_logger)));
});
}
Aşağıdaki kod zaman uyumlu olarak uygular IPageFilter :
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
namespace PageFilter.Filters
{
public class SamplePageFilter : IPageFilter
{
private readonly ILogger _logger;
public SamplePageFilter(ILogger logger)
{
_logger = logger;
}
public void OnPageHandlerSelected(PageHandlerSelectedContext context)
{
_logger.LogDebug("Global sync OnPageHandlerSelected called.");
}
public void OnPageHandlerExecuting(PageHandlerExecutingContext context)
{
_logger.LogDebug("Global sync PageHandlerExecutingContext called.");
}
public void OnPageHandlerExecuted(PageHandlerExecutedContext context)
{
_logger.LogDebug("Global sync OnPageHandlerExecuted called.");
}
}
}
Aşağıdaki kod şunları sunar SamplePageFilter :
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(new SamplePageFilter(_logger));
});
}
RazorFiltre yöntemlerini geçersiz kılarak sayfa filtrelerini uygulama
Aşağıdaki kod, zaman uyumlu Razor sayfa filtrelerini geçersiz kılar:
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace PageFilter.Pages
{
public class IndexModel : PageModel
{
private readonly ILogger _logger;
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public string Message { get; set; }
public void OnGet()
{
_logger.LogDebug("IndexModel/OnGet");
}
public override void OnPageHandlerSelected(
PageHandlerSelectedContext context)
{
_logger.LogDebug("IndexModel/OnPageHandlerSelected");
}
public override void OnPageHandlerExecuting(
PageHandlerExecutingContext context)
{
Message = "Message set in handler executing";
_logger.LogDebug("IndexModel/OnPageHandlerExecuting");
}
public override void OnPageHandlerExecuted(
PageHandlerExecutedContext context)
{
_logger.LogDebug("IndexModel/OnPageHandlerExecuted");
}
}
}
Filtre özniteliği uygulama
Yerleşik öznitelik tabanlı filtre Onresultexecutionasync filtresi, alt sınıflı olabilir. Aşağıdaki filtre yanıta bir üst bilgi ekler:
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Filters;
namespace PageFilter.Filters
{
public class AddHeaderAttribute : ResultFilterAttribute
{
private readonly string _name;
private readonly string _value;
public AddHeaderAttribute (string name, string value)
{
_name = name;
_value = value;
}
public override void OnResultExecuting(ResultExecutingContext context)
{
context.HttpContext.Response.Headers.Add(_name, new string[] { _value });
}
}
}
Aşağıdaki kod AddHeader özniteliğini uygular:
[AddHeader("Author", "Rick")]
public class ContactModel : PageModel
{
private readonly ILogger _logger;
public ContactModel(ILogger<ContactModel> logger)
{
_logger = logger;
}
public string Message { get; set; }
public async Task OnGetAsync()
{
Message = "Your contact page.";
_logger.LogDebug("Contact/OnGet");
await Task.CompletedTask;
}
}
Sıralamayı geçersiz kılma yönergeleri için bkz. varsayılan sırayı geçersiz kılma .
Filtre işlem hattının bir filtreden kısa devre dışı olması için bkz. iptal ve kısa devre.
Yetkilendir filtre özniteliği
Yetkilendir özniteliği bir öğesine uygulanabilir PageModel :
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace PageFilter.Pages
{
[Authorize]
public class ModelWithAuthFilterModel : PageModel
{
public IActionResult OnGet() => Page();
}
}