如何在ASP.NET Core中创建通用路由处理程序

时间:2017-09-27 11:26:39

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

我想创建一个路由处理程序,它将重定向到action / controller取决于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方法。 还有其他技巧吗?

1 个答案:

答案 0 :(得分:4)

使用操作过滤器解决方案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 类的一部分。 (控制器类已经有这种方法,但它受到保护)

不要忘记注册 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);
    }
}

<强> Startup.Configure

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