Не удается изменить целевой контроллер / действие через IRouter - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть простой 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:1007 *

        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/existingRoute должен перейти на InformationController.StoreContacts, но я получаю только 404.

Также mysite.com / StoreContacts доступен по прямому URL.

1 Ответ

0 голосов
/ 19 декабря 2018

Маршрутизация атрибутов займет обычную маршрутизацию, поэтому вы можете удалить атрибут маршрутизации:

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