Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何在ASP.NET Core中创建通用路由处理程序_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

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

Asp.net core 如何在ASP.NET Core中创建通用路由处理程序,asp.net-core,asp.net-core-mvc,Asp.net Core,Asp.net Core Mvc,我想创建一个路由处理程序,根据url重定向到action/controller。例如,在ASP.NET MVC 4,5中,我们可以创建自定义路由类并覆盖GetRouteData方法,并设置自己的路由值,例如 public override RouteData GetRouteData(HttpContextBase httpContext){ RouteData data = base.GetRouteData(httpContext); data.Values["controlle

我想创建一个路由处理程序,根据url重定向到action/controller。例如,在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.NETCore中也尝试过这样做,但无法重写 GetRouteData方法。
还有其他窍门吗?

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

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

只需注意方法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);
    }
}
启动。配置

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

是否可以使用路由约束,即IRouteConstraint接口?请注意,
redirectoaction
实际上会向客户端发送一个重定向HTTP响应,请求客户端在重定向位置发出另一个请求。另一方面,OP似乎希望在用户未注意到的情况下,动态地将请求重定向到不同的操作。