Asp.net RouteValueDictionary忽略空值
我希望查询字符串中有几个空路由值:Asp.net RouteValueDictionary忽略空值,asp.net,.net,asp.net-mvc,asp.net-mvc-5,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 5,我希望查询字符串中有几个空路由值: var routeValues = new RouteValueDictionary(); routeValues.Add("one", ""); routeValues.Add("two", null); routeValues.Add("three", string.Empty); 如果我随后将其传递给UrlHelper.RouteUrl(),它将忽略所有值,并且生成的查询字符串为空。然而,像/?one=&two=&three=这样的URL是完全有效的。
var routeValues = new RouteValueDictionary();
routeValues.Add("one", "");
routeValues.Add("two", null);
routeValues.Add("three", string.Empty);
如果我随后将其传递给
UrlHelper.RouteUrl()
,它将忽略所有值,并且生成的查询字符串为空。然而,像/?one=&two=&three=
这样的URL是完全有效的。如何才能做到这一点?此行为内置于默认路由类中。它调用parseDroote.Bind()方法,在该方法中执行以下检查:
if (IsRoutePartNonEmpty(obj2))
{
acceptedValues.Add(key, obj2);
}
这是什么意思
private static bool IsRoutePartNonEmpty(object routePart)
{
string str = routePart as string;
if (str != null)
{
return (str.Length > 0);
}
return (routePart != null);
}
这可以有效地防止任何查询字符串值为空时被输出。它所做的一切都是私有的、静态的、内部的,并且不可能被覆盖。因此,实际上只有两个选项可以覆盖此行为
我想第三种选择是不使用它,正如其他人指出的那样,这其实不是问题,因为在查询字符串中有一个空参数几乎没有价值。此行为内置于默认路由类中。它调用parseDroote.Bind()方法,在该方法中执行以下检查:
if (IsRoutePartNonEmpty(obj2))
{
acceptedValues.Add(key, obj2);
}
这是什么意思
private static bool IsRoutePartNonEmpty(object routePart)
{
string str = routePart as string;
if (str != null)
{
return (str.Length > 0);
}
return (routePart != null);
}
这可以有效地防止任何查询字符串值为空时被输出。它所做的一切都是私有的、静态的、内部的,并且不可能被覆盖。因此,实际上只有两个选项可以覆盖此行为
我想第三种选择是不使用它,正如其他人指出的那样,这不是一个真正的问题,因为在查询字符串中有一个空参数几乎没有值或没有值。是否
string.empty
生成相同的结果?是否。更新了帖子。我在这里没有看到问题。我也没有。在您的控制器中,参数应该是null
,这样您将得到一个没有传递值的指示。如果您确实希望将它们用作标志,为什么不直接传递/?one=true&two=false&two=true
?这对我来说更有意义。null
和空字符串之间有着明显的区别,我想让查询字符串更短。string.empty
是否会生成相同的结果?确实如此。更新了帖子。我在这里没有看到问题。我也没有。在您的控制器中,参数应该是null
,这样您将得到一个没有传递值的指示。如果您确实希望将它们用作标志,为什么不直接传递/?one=true&two=false&two=true
?这对我来说更有意义。null
和空字符串之间有明显的区别,我想让查询字符串更短。字符串很好。但它也忽略Guid.Empty(00000000-0000-0000-0000-000000000000)。很遗憾,您不能将Guid.Empty用作默认操作参数,因为它不是编译时常量。如果需要对url进行哈希验证,则缺少空参数是一个很大的问题。字符串可以。但它也忽略Guid.Empty(00000000-0000-0000-0000-000000000000)。很遗憾,您不能将Guid.Empty用作默认操作参数,因为它不是编译时常量。如果需要对url进行哈希验证,则缺少空参数是一个巨大的问题。