首页 新闻 会员 周边 捐助

ASP.NET Core 中如何实现动态路由

0
悬赏园豆:50 [已解决问题] 解决于 2020-08-05 09:09

在一个 ASP.NET Core 项目中,添加了下面的属性路由配置:

[Route("{brand}")]
public class BrandController : Controller
{
    [Route("home/{pageIndex:int?}")]
    public async Task<IActionResult> Home(string brand, int? pageIndex = 1)
    {
        // ...
        return View($"~/Views/Brands/{model.Brand}/Home.cshtml", model);
    }
}

想实现根据 brand 的值进行路由,比如请求路径是 /huawei ,就走上面的路由,否则走默认路由。

dudu的主页 dudu | 高人七级 | 园豆:30925
提问于:2020-07-26 12:30
< >
分享
最佳答案
1

后来实际采用的解决方法如下。

实现 BrandRouteValueTransformer

public class BrandRouteValueTransformer : DynamicRouteValueTransformer
{
    public override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        if (values.TryGetValue("brand", out var brand))
        {
            if (BrandCollection.All.Any(b => b.Equals(brand.ToString(), StringComparison.OrdinalIgnoreCase)))
            {
                values["controller"] = "Brand";

                if (!values.TryGetValue("action", out var action))
                {
                    values["action"] = "Home";
                }
            }
        }

        return new ValueTask<RouteValueDictionary>(values);
    }
}

Startup.ConfigureServices 中注册

services.AddSingleton<BrandRouteValueTransformer>();

Startup.Configure 中添加路由

endpoints.MapDynamicControllerRoute<BrandRouteValueTransformer>("{brand}/{**slug}");

Program.Main 中打补丁

AppContext.SetSwitch("Microsoft.AspNetCore.Routing.UseCorrectCatchAllBehavior", true);
dudu | 高人七级 |园豆:30925 | 2020-08-05 09:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册