【问题标题】:base api controller get route c#基本 api 控制器获取路由 c#
【发布时间】:2018-06-15 08:00:37
【问题描述】:
[Route("api/advertisement/{brandID}/{advertisementID}")]
public class BaseApiController : ApiController
{
    public string AdvertisementID { get; private set; }
    public int BrandID { get; private set; }
    public BaseReportRepository ReportRepository { get; private set; }

    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);

        var routeData = controllerContext.RouteData;

        this.AdvertisementID = routeData.Values["advertisementID"].ToString();
        this.BrandID = (int)routeData.Values["brandID"];

        this.ReportRepository = RepositoryFactory
            .CreateRepository(this.BrandID)
            .ReportRepository;
    }
}

为什么无法获取路由器数据brandID

【问题讨论】:

  • 你在那个可变的 null 或空字符串中实际上有什么?
  • 还有你怎么称呼它的?您使用的网址。
  • @Prashant 很确定ApiControllerInitialize 方法没有覆盖,包括brandIDadvertismentID
  • 获取路由器数据值“MS_SubRoutes”
  • This 似乎相关。

标签: c# asp.net-web-api


【解决方案1】:

这样的事情应该可以解决你的问题:

IHttpRouteData requestRouteData = controllerContext.Request.GetRouteData();
IEnumerable<IHttpRouteData> subroutes = (IEnumerable<IHttpRouteData>)requestRouteData.Values["MS_SubRoutes"];
IHttpRouteData routeData = subroutes.FirstOrDefault();
if (routeData != null)
{
    this.AdvertisementID = routeData.Values["advertisementID"].ToString();
    this.BrandID = int.Parse(routeData.Values["brandID"].ToString());
}

你还应该限制你的brandID参数:

[Route("api/advertisement/{brandID:int}/{advertisementID}")]

如果您以任何方式(例如在 ControllerSelector 中)遍历路由集合,了解这些路由的实际位置很重要。当您使用属性路由时,所有路由属性都会添加到没有名称的公共路由中。这是一个特殊的路由,它是一个名为 RouteCollectionRoute 的内部类的实例。 此路由有一组子路由,您可以查询这些子路由,其中​​包括 all 属性路由。

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 2015-10-25
    • 2013-12-19
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多