我们说我有一些网址如下: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 >
个对象而不是字符串?
答案 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)
只为好奇的灵魂发帖,可能与问题无关。只是警告提示。
我发现自己也遇到类似的问题。这种类型还有其他几个问题。
如果您的查询参数没有值。例如:/products?pageNo=1&pageSize=
您会发现自己为pageSize
参数抛出了一个异常,Count
StringValues
的属性将为您提供值1,但基础_value
为""
(空
字符串),而_values
是null
。注意-您尝试转换或发生异常
访问IQueryCollection中的值)
使用TryGetValue
将使您从StringValues
中安全地获得价值,但如果为null
(例如上面的pageSize
参数),您将很难找出原因
您不能将StringValues
转换为简单的String
还是为什么不能与null
进行比较
对它进行进一步的操作,例如验证等。
要对StringValues
类型进行任何检查,请使用该类型提供的方法。
要检查是否为空或为空-StringValues.IsNullOrEmpty(StringValues value)