首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.NET核心5中更新RouteTable

在.NET核心5中更新RouteTable
EN

Stack Overflow用户
提问于 2021-09-30 19:25:19
回答 1查看 67关注 0票数 0

我正在尝试为我正在构建的小型内容管理系统创建自定义路由。我总是使用下面这样的结构,我为存在于数据库中的每个内容页面创建了一个具有唯一标识符的特定路由。这发生在startup.cs中

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

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

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

这在(相对)复杂的树结构的情况下非常方便。我现在正在从头开始构建一些东西,我想再次使用类似的结构。上面的方法在.NET核心5中有效。然而,我正在努力的地方是在保存时更新路由表。如果页面的URL发生了变化,我希望更新路由表。然而,RouteTable已不复存在,我也找不到如何从我的控制器或服务更新路由。这是我曾经做过的事情(某种程度上;)

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-07 07:36:40

编辑:

所以我已经用MapDynamicControllerRoute解决了这个问题

代码语言:javascript
复制
endpoints.MapDynamicControllerRoute<CmsRouteTransformer>("/{**slug}");

然后你可以做一些类似这样的事情:

代码语言:javascript
复制
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只是一个服务,它具有更新的onSave的slug/id映射。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69397862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档