首页 > 解决方案 > 在 .NET Core 5 中更新 RouteTable

问题描述

我正在尝试为我正在构建的小型 CMS 的内容页面创建自定义路由。我一直使用类似下面的结构,在该结构中,我为数据库中存在的每个内容页面创建了一个具有唯一标识符的特定路由。这发生在 startup.cs

routes.MapRoute(
    page.Id.ToString(), // Unique route name
    page.Url.TrimStart('/'), // URL with parameters
    new { controller = "Home", action = "GetPage", guid = page.Id } // Parameter defaults
);

这使得我可以在我的控制器中做这样的事情

public ActionResult GetPage()
{
    Guid id = Guid.Parse(RouteData.Values["guid"].ToString());
    // content page?
    ContentPageModel model = pageService.GetPageById(id);
    return View("index", model);
}

在(相对)复杂的树结构的情况下,这非常方便。我现在正在从头开始构建一些东西,我想再次使用类似的结构。以上适用于.NET Core 5。但是我正在努力更新保存时的路由表。如果页面有 URL 更改,我想更新路由表。但是,RouteTable不再存在,我找不到如何从我的控制器或服务更新路由。这就是我以前做的(有点;)

var routes = RouteTable.Routes;
// remove old route
var oldRoute = routes[routeItem.RouteName];
routes.Remove(oldRoute);
    
//add new route for page
routes.MapRoute(
  routeItem.RouteName, // Route name
  routeItem.Url, // URL with parameters
  new { controller = routeItem.Controller, action = routeItem.Action, guid = routeItem.RouteName } // Parameter defaults);

标签: c#asp.net-core-5.0

解决方案


编辑:

所以我通过使用解决了这个问题MapDynamicControllerRoute

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

然后您可以执行以下操作:

public class CmsRouteTransformer : DynamicRouteValueTransformer
{    
    public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        string url = string.Join("/", values.Values);
        var pageId = await _pageFinder.FindByUrl(url);
      
        if(pageId == null)
        {
            values["controller"] = "Home";
            values["action"] = "NotFound";
        }
        else
        {
            values["controller"] = "Home";
            values["action"] = "Page";
            values["guid"] = pageId;
        }
    
        return values;
    }
}

pageFinder只是一个具有更新的 slug/id 映射的服务onSave


推荐阅读