首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以通过编程将多个RouteAttributes添加到给定的ControllerModel

有没有一种方法可以通过编程将多个RouteAttributes添加到给定的ControllerModel
EN

Stack Overflow用户
提问于 2019-07-09 23:38:53
回答 1查看 160关注 0票数 0

目前,我正在使用下面的代码以编程方式设置我的所有api路由,这很好用。

我想要实现的是以编程方式为每个操作设置2个路由,而不是在每个操作上手动设置两次RouteAttribute("MY_ROUTE")

这就是我目前设置路由的方式。

代码语言:javascript
复制
public static void Map(ControllerModel model)
{
    string templatePrefix = "api/services/app";
    ...
    if (AppStore.Contains(model.ControllerName))
        templatePrefix = "api/services/AppStore";
    ...
    foreach (var action in model.Actions)
    {
        var verb = ProxyScriptingHelper.GetConventionalVerbForMethodName(action.ActionName);
        var constraint = new HttpMethodActionConstraint(new List<string> { verb });

        foreach (var selector in action.Selectors)
        {
            selector.ActionConstraints.Add(constraint);
            selector.AttributeRouteModel = new AttributeRouteModel(new RouteAttribute($"{templatePrefix.EnsureEndsWith('/')}{action.Controller.ControllerName}/{action.ActionName}"));
        }
    }
}

我尝试过AttributeRouteModel.CombineAttributedRouteModel,但它将路由字符串连接在一起,这不是我所期望的。

使用上面的代码,所有的AppStore控制器动作都变成了

代码语言:javascript
复制
api/services/AppStore/getApps1
api/services/AppStore/getApps2
api/services/AppStore/getApps3

我希望得到的结果是

代码语言:javascript
复制
api/services/app/getApps1
api/services/AppStore/getApps1

api/services/app/getApps2
api/services/AppStore/getApps2

api/services/app/getApps3
api/services/AppStore/getApps3
EN

回答 1

Stack Overflow用户

发布于 2019-07-17 00:55:52

您可以使用action.Selectors.Add()。目前,您只需使用自定义路由覆盖默认选择器。另外,我认为你的逻辑有一点小缺陷。您正在覆盖templatePrefix,但是您声称您实际上希望注册这两个路由。

您可以尝试类似以下内容的操作:

代码语言:javascript
复制
public static void Map(ControllerModel model)
{
    string templatePrefix = "api/services/app";
    ...
    foreach (var action in model.Actions)
    {
        var verb = ProxyScriptingHelper.GetConventionalVerbForMethodName(action.ActionName);
        var constraint = new HttpMethodActionConstraint(new List<string> { verb });

        foreach (var selector in action.Selectors)
        {
            selector.ActionConstraints.Add(constraint);
            selector.AttributeRouteModel = new AttributeRouteModel(new RouteAttribute($"{templatePrefix.EnsureEndsWith('/')}{action.Controller.ControllerName}/{action.ActionName}"));
        }
    if (AppStore.Contains(model.ControllerName))
            {
                templatePrefix = "api/services/AppStore";
                var sm = new SelectorModel
                {
                    AttributeRouteModel = new AttributeRouteModel(new RouteAttribute(
                        $"{templatePrefix.EnsureEndsWith('/')}{action.Controller.ControllerName}/{action.ActionName}"))
                };
                sm.ActionConstraints.Add(constraint);
                action.Selectors.Add(sm);
            }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56956156

复制
相关文章

相似问题

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