【问题标题】:Rewriting URLs with MVC/Endpoint Routing使用 MVC/端点路由重写 URL
【发布时间】:2019-11-07 00:35:18
【问题描述】:

我正在尝试让 URL 重写与 MVC/端点路由结合使用。以下是我的 Startup.Configure 方法的相关部分:

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

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

和重写规则测试:

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

这似乎遵循推荐的内容,但是当我点击 /index 时得到 404。我可以在上面的 if 语句中设置断点。我也可以直接导航到 /Home/Privacy 并且效果很好。我已经尝试了 RuleResult 的所有三个选项。为什么重写不提供修改后的 URL?

【问题讨论】:

  • 我刚刚测试并确认,如果我使用 app.UseMvc 而不是 app.UseEndpoints,它可以工作。我想我在这里遗漏了一些明显的东西。

标签: asp.net-core asp.net-core-mvc


【解决方案1】:

你还需要把url重写中间件放在app.UseRouting()之前:

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

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

【讨论】:

    【解决方案2】:

    您需要使用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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2019-02-24
      • 2015-02-09
      • 1970-01-01
      • 2014-04-23
      相关资源
      最近更新 更多