在WebApi中,RouteData
具有Values
属性,该属性是存储路径数据的地方。但是,由于某种原因,它实现了IDictionary<string, object>
而不是IDictionary<string, string>
。值类型是不是一个字符串?
上下文是我正在编写自定义IHttpRouteConstraint
来检查整数是否在指定范围内。为此,我必须将我的值转换为string
,然后使用int.TryParse
。但如果该值实际为int
,则会失败。这会发生吗?
答案 0 :(得分:2)
如果您看到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() });
假设你有这个控制器:
public class ValuesController : ApiController
{
public string Get(int id) { return "Value"; }
}
如果您向&#34; / api / values / Get / 1&#34;发出GET请求您会注意到值的类型为
但是
如果您向&#34; / api / values / 1&#34;发出GET请求您会注意到值的类型为
/// <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; }
}
所以,有一次,当你没有提供可选参数时,这不是一个字符串 您应该首先检查对象的类型,并且只有当它是非空字符串时,尝试解析它