2017-09-27 81 views
2

我想創建一個將重定向到動作/控制器的路由處理程序,具體取決於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方法。 有沒有其他的技巧?

+0

您可以使用路由約束,即IRouteConstraint接口嗎?在這裏找到博客文章:https://tommyb.com/customizing-asp-net-cores-route-constraints-and-model-binding/ – Jack

回答

2

溶液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的類的一部分。通過使用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)); 
}); 
+1

請注意,'RedirectToAction'實際上發送一個重定向HTTP響應到客戶端,請求他們在重定向的位置發出另一個請求。另一方面,OP似乎希望在沒有用戶注意的情況下立即將請求重新定位到不同的動作。 – poke

+0

@poke,是的,你是對的。我想這樣做沒有重定向... – Buckethead

+0

@Buckethead答案更新 –

相關問題