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 Can';t通过IRouter更改目标控制器/操作_Asp.net Core_Routing_Routes_Asp.net Core Mvc_Asp.net Core 2.1 - Fatal编程技术网

Asp.net core Can';t通过IRouter更改目标控制器/操作

Asp.net core Can';t通过IRouter更改目标控制器/操作,asp.net-core,routing,routes,asp.net-core-mvc,asp.net-core-2.1,Asp.net Core,Routing,Routes,Asp.net Core Mvc,Asp.net Core 2.1,我有一个简单的MyRouter: public class MyRouter : IRouter { private readonly IRouteBuilder _routeBuilder; public MyRouter(IRouteBuilder routeBuilder) { _routeBuilder = routeBuilder; } public async Task RouteAsync(RouteContext con

我有一个简单的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访问。

属性路由将取代传统路由,因此您可以删除属性路由:

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";
}