【问题标题】:How to create generic route handler in ASP.NET Core如何在 ASP.NET Core 中创建通用路由处理程序
【发布时间】:2018-03-08 20:57:24
【问题描述】:

我想创建一个路由处理程序,它将重定向到动作/控制器取决于 url。例如在 ASP.NET MVC 4,5 中,我们可以创建自定义路由类并覆盖 GetRouteData 方法并设置自己的路由值,例如

 public override RouteData GetRouteData(HttpContextBase httpContext){

  RouteData data = base.GetRouteData(httpContext);
  data.Values["controller"] = "SomeController";
  data.Values["action"] = "SomeAction";

  return data;
}

我尝试在 ASP.NET Core 中做同样的事情,但无法覆盖 GetRouteData 方法。 还有什么技巧吗?

【问题讨论】:

  • 能不能用路由约束,也就是IRouteConstraint接口?在这里找到博文:tommyb.com/…

标签: asp.net-core asp.net-core-mvc


【解决方案1】:

使用操作过滤器的解决方案 1

Action filters

public class SampleActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        var myController = ((MyController)context.Controller);
        context.Result = myController.RedirectToAction("SomeAction", "SomeController");
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {            
    }
}

请注意,方法 RedirectToAction()MyController 类的一部分。 (Controller类已经有这个方法了,但是被保护了)

别忘了注册它Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.Filters.Add(typeof(SampleActionFilter));
    });
}

使用 IRouter 的解决方案 2

class MyRouter : IRouter
{
    private readonly IRouter _defaulRouter;

    public MyRouter(IRouter defaulRouter)
    {
        _defaulRouter = defaulRouter;
    }

    public async Task RouteAsync(RouteContext context)
    {
        // Set controller and action based on context.HttpContext.Request url
        context.RouteData.Values["controller"] = "Home";
        context.RouteData.Values["action"] = "About";
        await _defaulRouter.RouteAsync(context);
    }

    public VirtualPathData GetVirtualPath(VirtualPathContext context)
    {
        return _defaulRouter.GetVirtualPath(context);
    }
}

启动.配置

app.UseMvc(routes =>
{
    routes.Routes.Add(new MyRouter(routes.DefaultHandler));
});

【讨论】:

  • 请注意,RedirectToAction 实际上向客户端发送了一个重定向 HTTP 响应,请求他们在重定向的位置发出另一个请求。另一方面,OP 似乎希望在不引起用户注意的情况下即时将请求重定向到不同的操作。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 2011-05-02
  • 2019-09-24
  • 1970-01-01
  • 2011-10-14
  • 2016-10-07
  • 1970-01-01
  • 2017-03-06
相关资源
最近更新 更多