无法通过 IRouter 更改目的地 controller/action
Can't change destination controller/action via IRouter
我有简单的 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";
}
我有简单的 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";
}