【问题标题】:Can't change destination controller/action via IRouter无法通过 IRouter 更改目标控制器/操作
【发布时间】:2018-12-18 20:07:37
【问题描述】:

我有简单的 MyRouter:

public class MyRouter : IRouter
{
    private readonly IRouteBuilder _routeBuilder;

    public MyRouter(IRouteBuilder routeBuilder)
    {
        _routeBuilder = routeBuilder;
    }

    public async Task RouteAsync(RouteContext context)
    {
        if (ShouldReroute(...))
        {
            SetNeededPath(context, reroute);
        }

        await GetDefaultRouter().RouteAsync(context);
    }

    private bool ShouldReroute(...)
    {
        return true;
    }

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

    private IRouter GetDefaultRouter()
    {
        return _routeBuilder.DefaultHandler;
    }

    private void SetNeededPath(RouteContext context, Reroute reroute)
    {
        context.RouteData.Values.Clear();

        context.RouteData.Values["action"] = "StoreContacts";
        context.RouteData.Values["controller"] = "Information";
    }
}

如您所见,它应该将请求的目的地更改为:

[Route("")]
public class InformationController : Controller
{
    [Route("StoreContacts")]
    public IActionResult StoreContacts()
    {
        return View();
    }
}

Startup.cs 中的路由器描述为:

        app.UseMvc(routes =>
        {
           routes.MapRoute(
                name: "areas",
                template: "{area:exists}/{controller=Home}/{action=Index}");

            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");

            routes.Routes.Add(new MyRouter(routes));
        });

所以在我的大脑中,它应该重定向所有未映射的请求,例如 mysite.com/unexistingRoute 应该转到 InformationController.StoreContacts,但我只得到 404。

mysite.com/StoreContacts 也可通过直接 URL 获得。

【问题讨论】:

    标签: asp.net-core routing routes asp.net-core-mvc asp.net-core-2.1


    【解决方案1】:

    属性路由会接管常规路由,所以你可以去掉属性路由:

    public class InformationController : Controller
    {
    
        public IActionResult StoreContacts()
        {
            return View();
        }
    }
    

    并通过 IRouter 将您的逻辑移动到自定义路由中。 mysite.com/unexistingRoute 不会映射到 Startup.cs 中现有的路由模板配置。所以删除属性应该在你的场景中工作。要映射其他 url,如 mysite.com/OtherAction ,您可以编写自定义逻辑,如:

    if (context.HttpContext.Request.Path.Value.StartsWith("/StoreContacts"))
    {
            context.RouteData.Values["controller"] = "Information";
            context.RouteData.Values["action"] = "StoreContacts";
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 1970-01-01
      • 2012-12-21
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多