gpt4 book ai didi

c# - 在 ASP.NET WebApi 中,为什么 RouteData 的值类型是 "object"而不是 "string"

转载 作者:行者123 更新时间:2023-11-30 16:50:10 26 4
gpt4 key购买 nike

在 WebApi 中,RouteData有一个 Values存储路由数据的属性。然而,出于某种原因,它实现了 IDictionary<string, object>而不是 IDictionary<string, string> .值类型永远不会是字符串吗?

上下文是我正在编写自定义 IHttpRouteConstraint检查整数是否在指定范围内。为此,我必须将我的值转换为 string然后使用 int.TryParse .但如果该值实际上是 int,这将失败.这会发生吗?

最佳答案

如果您看到 source code ,您会注意到值不是字符串的单元测试(例如 BindValuesAsync_RouteData_Values_To_Simple_Types )。

你说你正在写一个自定义约束,让我们来看看这个:

 public class MyConstraint : IHttpRouteConstraint
{
public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
{
string parameters = string.Join(Environment.NewLine, values.Select(p => p.Value.GetType().FullName).ToArray());
return true;
}
}

你注册它:

 config.Routes.MapHttpRoute("DefaultApi",
"api/{controller}/{action}/{id}",
new { id = RouteParameter.Optional },
new { isLocal = new MyConstraint() });

假设你有这个 Controller :

public class ValuesController : ApiController
{
public string Get(int id) { return "Value"; }
}

如果您向“/api/values/Get/1”发出 GET 请求,您会注意到值的类型

  • System.String//值
  • System.String//获取
  • System.String//1

但是

如果您向“/api/values/1”发出 GET 请求,您会注意到值的类型

  • System.String//值
  • System.String//1
  • System.Web.Http.RouteParameter

如果您看到 source code of the class

/// <summary>
/// The <see cref="RouteParameter"/> class can be used to indicate properties about a route parameter (the literals and placeholders
/// located within segments of a <see cref="M:IHttpRoute.RouteTemplate"/>).
/// It can for example be used to indicate that a route parameter is optional.
/// </summary>
public sealed class RouteParameter
{
public static readonly RouteParameter Optional = new RouteParameter();

// singleton constructor
private RouteParameter() { }

public override string ToString() { return string.Empty; }
}

因此,有一种情况是当您不提供可选参数时这不是字符串。
您应该首先检查对象的类型,只有当它是一个非空字符串时,才尝试解析它

关于c# - 在 ASP.NET WebApi 中,为什么 RouteData 的值类型是 "object"而不是 "string",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35469356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com