Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net RouteValueDictionary忽略空值_Asp.net_.net_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

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);
}
这可以有效地防止任何查询字符串值为空时被输出。它所做的一切都是私有的、静态的、内部的,并且不可能被覆盖。因此,实际上只有两个选项可以覆盖此行为

  • 子类Route并重写GetVirtualPath(),用自定义实现替换ParseDroote.Bind()
  • 子类RouteBase并创建自定义路由实现

  • 我想第三种选择是不使用它,正如其他人指出的那样,这其实不是问题,因为在查询字符串中有一个空参数几乎没有价值。

    此行为内置于默认路由类中。它调用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);
    }
    
    这可以有效地防止任何查询字符串值为空时被输出。它所做的一切都是私有的、静态的、内部的,并且不可能被覆盖。因此,实际上只有两个选项可以覆盖此行为

  • 子类Route并重写GetVirtualPath(),用自定义实现替换ParseDroote.Bind()
  • 子类RouteBase并创建自定义路由实现

  • 我想第三种选择是不使用它,正如其他人指出的那样,这不是一个真正的问题,因为在查询字符串中有一个空参数几乎没有值或没有值。

    是否
    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进行哈希验证,则缺少空参数是一个巨大的问题。