【问题标题】:Call particular filter for particular Razor Pages Route?为特定的 Razor 页面路由调用特定的过滤器?
【发布时间】:2018-08-04 23:53:25
【问题描述】:

我有 2 个域(.com.ru)和 2 个 URL,例如 site.com/about-ussite.ru/o-nas,它们应该重定向到同一页面。该网站使用 Razor 页面。

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

  • site.COM/o-nas 不应该工作并返回Not Found (404)

  • site.RU/about-us 不应该工作并返回Not Found (404)

    我发现过滤器可以正常工作,但是对于site.com/about-ussite.ru/o-nas,这两个过滤器都被调用了。

如何只为特定的 URL 调用 1,可以吗?谢谢,我当前的代码如下。

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

最后是来自Startup.csConfigureServices 方法:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.DomainEng("/AboutUs", "about-us");
            options.Conventions.DomainRussian("/AboutUs", "o-nas");
        })
}

【问题讨论】:

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


    【解决方案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>();
    });
    

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 2023-03-24
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多