为什么StringValues用于Request.Query值?

时间:2018-01-10 13:51:06

标签: c# asp.net-core

我们说我有一些网址如下:www.myhost.com/mypage?color = blue

在Asp.Net Core中,我希望通过执行以下操作获取颜色查询参数值:

Request.Query["color"]

但事实证明,StringValues返回的值为string而不是StringValues。那是为什么?

显然string[]类型可以包含字符串数组,并且包含对string color = Request.Query["color"].ToString();的隐式转换的支持,这很酷,但为什么查询参数值需要?

必须得到这样的价值似乎很奇怪:

if(Request.Query["color"] == null) { //param was not not specified }

更糟糕的是,检查一个值以查看是否指定了查询参数不能再这样做了

 if(Request.Query["color"].Count == 0) { 
      //param was not not specified
 }

但必须像这样检查

Request.Query["color"]

由于单个查询参数不能有多个值(据我所知)为什么StringValues会返回<form action="result.php" method="post" enctype="multipart/form-data"> <input type="file" name="upload_images[]" id="image_file" multiple > 个对象而不是字符串?

4 个答案:

答案 0 :(得分:18)

因为您的查询可能如下所示:

  

www.myhost.com/mypage?color=blue&color=red&color=yellow

您可以从一个color参数中获取所有Request.Query["color"]个值

答案 1 :(得分:9)

正如其他人已经提到的,类型是StringValues对象,因为从技术上讲,允许多个值。虽然通常的做法是只设置一个值,但URI规范并不会多次禁止设置值。并由应用程序决定如何处理它。

话虽如此,StringValues隐式转换为string,因此您实际上不需要在其上调用ToString(),您可以像使用它一样使用它串。所以做Request.Query["color"] == "red"之类的事情,或者将它传递给一个需要字符串的方法就可以了。

  

更糟糕的是,检查一个值以查看是否指定了查询参数不能像Request.Query["color"] == null那样完成,而是必须像Request.Query["color"].Count == 0那样进行检查

这只是半真的。是的,为了检查StringValues对象是否为空,您可以检查其Count属性。您还可以查看StringValues.Empty

Request.Query["color"] == StringValues.Empty

但是,最初的“问题”是Request.Query[x]始终返回非空StringValues对象(因此检查任何值都是安全的)。如果要检查查询参数中是否存在密钥,则应使用ContainsKey

if (Request.Query.ContainsKey("color"))
{
    // only now actually retrieve the value
    string colorValue = Request.Query["color"];
}

或者,使用TryGetValue

if (Request.Query.TryGetValue("color", out var colorValue))
{
    DoSomething(colorValue);
}

尽管如此,大多数时候访问Request.Query并不是必需的。你应该只使用model binding来代替它,它会自动为你提供你需要的查询参数,只需将它们放在动作的签名中即可:

public ActionResult MyAction(string color)
{
    DoSomething(color);
}

答案 2 :(得分:1)

您不应使用Request.Query

public ActionResult SaveColor(string color);

让Mvc处理它。

答案 3 :(得分:1)

只为好奇的灵魂发帖,可能与问题无关。只是警告提示。

我发现自己也遇到类似的问题。这种类型还有其他几个问题。

  1. 如果您的查询参数没有值。例如:/products?pageNo=1&pageSize=

    您会发现自己为pageSize参数抛出了一个异常,Count StringValues的属性将为您提供值1,但基础_value""(空 字符串),而_valuesnull。注意-您尝试转换或发生异常 访问IQueryCollection中的值)

  2. 使用TryGetValue将使您从StringValues中安全地获得价值,但如果为null (例如上面的pageSize参数),您将很难找出原因 您不能将StringValues转换为简单的String还是为什么不能与null进行比较 对它进行进一步的操作,例如验证等。

  3. 要对StringValues类型进行任何检查,请使用该类型提供的方法。

要检查是否为空或为空-StringValues.IsNullOrEmpty(StringValues value)