【问题标题】:RouteValueDictionary ignores empty valuesRouteValueDictionary 忽略空值
【发布时间】:2014-03-27 09:05:34
【问题描述】:

我在查询字符串中有几个我想要的空路由值:

var routeValues = new RouteValueDictionary();
routeValues.Add("one", "");
routeValues.Add("two", null);
routeValues.Add("three", string.Empty);

如果我将它传递给UrlHelper.RouteUrl(),它将忽略所有值并且生成的查询字符串为空。然而,像/?one=&two=&three= 这样的网址是完全有效的。我该怎么做?

【问题讨论】:

  • String.Empty 是否产生相同的结果?
  • 确实如此。更新了帖子。
  • 我没有看到这里的问题。
  • 我也没有。在你的控制器中,参数应该是null,这样你就会得到一个没有值被传递的指示。如果您确实希望将它们用作标志,为什么不直接传递/?one=true&two=false&three=true?这对我来说更有意义。
  • null 和空字符串之间有明显的区别,我想保持查询字符串更短。

标签: asp.net .net asp.net-mvc asp.net-mvc-5


【解决方案1】:

此行为内置于默认 Route 类中。它调用 ParsedRoute.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);
}

这有效地防止任何查询字符串值在它们为空时被输出。它所做的一切都是私有的、静态的、内部的,否则无法覆盖。因此,实际上只有 2 个选项可以覆盖此行为。

  1. 继承 Route 并覆盖 GetVirtualPath(),将 ParsedRoute.Bind() 替换为自定义实现。
  2. 继承 RouteBase 并创建自定义路由实现。

我猜第三个选项是不要管它,因为其他人已经指出这不是一个真正的问题,因为在查询字符串中有一个空参数几乎没有价值。

【讨论】:

  • 字符串没问题。但它也忽略了 Guid.Empty (00000000-0000-0000-0000-000000000000)。不幸的是,您不能使用 Guid.Empty 作为默认操作参数,因为它不是编译时常量。
  • 如果您的 url 需要进行哈希验证,那么缺少空参数是一个大问题。
猜你喜欢
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多