Перезапись URL с помощью MVC / маршрутизации конечной точки - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь заставить URL-адреса переписываться для работы в сочетании с маршрутизацией MVC / конечной точки. Вот соответствующие части моего метода Startup.Configure:

app.UseRewriter(new RewriteOptions().Add(new RewriteRuleTest()));

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

И RewriteRuleTest:

public class RewriteRuleTest : IRule
{
    public void ApplyRule(RewriteContext context)
    {
        HttpRequest request = context.HttpContext.Request;

        if (request.Path.Value.ToLower() == "/index")
        {
            request.Path = "/Home/Privacy";
            context.Result = RuleResult.SkipRemainingRules;
        }
    }
}

Это похоже на то, что рекомендуется, но я получаю 404, когда нажимаю /индекс. Я могу достичь точки останова, установленной внутри оператора if выше. Я также могу перейти непосредственно к / Home / Privacy, и это прекрасно работает. Я перепробовал все три варианта RuleResult. Почему перезапись не будет обслуживать измененный URL?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Вам также необходимо установить промежуточное программное обеспечение для перезаписи URL до app.UseRouting():

app.UseRewriter(new RewriteOptions().Add(new RewriteRuleTest()));
app.UseRouting();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
});
0 голосов
/ 07 ноября 2019

Вам необходимо использовать DynamicRouteValueTransformer .

app.UseEndpoints(endpoints =>
        {
            endpoints.MapDynamicControllerRoute<TranslationTransformer>("{language}/{controller}/{action}");
        });

public class TranslationTransformer : DynamicRouteValueTransformer
{
    private readonly TranslationDatabase _translationDatabase;

    public TranslationTransformer(TranslationDatabase translationDatabase)
    {
        _translationDatabase = translationDatabase;
    }

    public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        if (!values.ContainsKey("language") || !values.ContainsKey("controller") || !values.ContainsKey("action")) return values;

        var language = (string)values["language"];
        var controller = await _translationDatabase.Resolve(language, (string)values["controller"]);
        if (controller == null) return values;
        values["controller"] = controller;

        var action = await _translationDatabase.Resolve(language, (string)values["action"]);
        if (action == null) return values;
        values["action"] = action;

        return values;
    }
}

подробнее https://www.strathweb.com/2019/08/dynamic-controller-routing-in-asp-net-core-3-0/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...