为特定的Razor Pages Route调用特定的过滤器?

时间:2018-02-25 11:43:29

标签: c# asp.net-core-2.0 razor-pages asp.net-core-routing

我有2个域名(sharey.com)以及2个网址,例如.rusite.com/about-us,应重定向到同一网页 。该网站使用Razor Pages。

此外,特定的URL应该在适当的域中可用。例如:

  • site.ru/o-nas不应该有效并返回site.COM/o-nas
  • Not Found (404)不应该有效并返回site.RU/about-us

    我发现过滤器工作正常,但对于Not Found (404)site.com/about-us,两个过滤器都会被调用。

如何仅针对特定网址拨打1,是否可以?谢谢,我目前的代码如下。

site.ru/o-nas

最后来自public static class DomainFilters { public static IPageApplicationModelConvention DomainEng( this PageConventionCollection con, string pageName, string route = "") { return con.AddPageApplicationModelConvention(pageName, model => { model.Filters.Add(new EnglishActionFilter(route)); }); } public static IPageApplicationModelConvention DomainRussian( this PageConventionCollection con, string pageName, string route = "") { return con.AddPageApplicationModelConvention(pageName, model => { model.Filters.Add(new RussianActionFilter(route)); }); } } public class EnglishActionFilter : IResultFilter { public void OnResultExecuting(ResultExecutingContext context) { if (context.HttpContext.Request.Host.ToString().Contains(".ru")) { context.Result = new NotFoundResult(); } } public void OnResultExecuted(ResultExecutedContext context) { } } public class RussianActionFilter : IResultFilter { public void OnResultExecuting(ResultExecutingContext context) { if (context.HttpContext.Request.Host.ToString().Contains(".com")) { context.Result = new NotFoundResult(); } } public void OnResultExecuted(ResultExecutedContext context) { } } 的{​​{1}}方法:

ConfigureServices

1 个答案:

答案 0 :(得分:1)

考虑实施自定义FilterFactory

public class LanguageFilterFactory : Attribute, IFilterFactory
{
    public bool IsReusable => false;

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        var context = serviceProvider.GetService<IHttpContextAccessor>();

        if (context.HttpContext.Request.Host.ToString().Contains(".com"))
        {
            return new EnglishActionFilter();
        }

        return new RussianActionFilter();
    }
}

此工厂将创建EnglishRussian过滤器(具体取决于域)。这完全是关于它的责任。剩下的就是过滤器本身(你需要更改过滤器内部的代码以使它们验证页面定位器):

public class RussianActionFilter : IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext context)
    {
        // you may want to play with RouteData in order to make this check more elegant   
        if (context.HttpContext.Request.Path.Value.Contains("About"))
        {
            context.Result = new NotFoundResult();
        }
    }
}

过滤器工厂的应用方式与其他过滤器相同:

[LanguageFilterFactory]
public class IndexModel : PageModel

Startup.cs文件更新:

.AddMvcOptions(options =>
{
   options.Filters.Add<LanguageFilterFactory>();
});