如何在ASP.NET Core中创建通用路由处理程序
我想创建一个将重定向到动作/控制器的路由处理程序,具体取决于url。例如在ASP.NET MVC 4,5中,我们可以创建自定义路由类并覆盖GetRouteData方法并设置自己的路由值,例如如何在ASP.NET Core中创建通用路由处理程序
public override RouteData GetRouteData(HttpContextBase httpContext){
RouteData data = base.GetRouteData(httpContext);
data.Values["controller"] = "SomeController";
data.Values["action"] = "SomeAction";
return data;
}
我试图做ASP.NET的核心是相同的,但没有posibility覆盖 GetRouteData方法。 有没有其他的技巧?
溶液1通过使用操作筛选
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的类的一部分。通过使用IRouter
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);
}
}
启动(Controller类已经有了这种方法,但它保护)
不要忘记注册它Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(typeof(SampleActionFilter));
});
}
解决方案2 。配置
app.UseMvc(routes =>
{
routes.Routes.Add(new MyRouter(routes.DefaultHandler));
});
请注意,'RedirectToAction'实际上发送一个重定向HTTP响应到客户端,请求他们在重定向的位置发出另一个请求。另一方面,OP似乎希望在没有用户注意的情况下立即将请求重新定位到不同的动作。 – poke
@poke,是的,你是对的。我想这样做没有重定向... – Buckethead
@Buckethead答案更新 –
您可以使用路由约束,即IRouteConstraint接口吗?在这里找到博客文章:https://tommyb.com/customizing-asp-net-cores-route-constraints-and-model-binding/ – Jack