如何测试 Request.QueryString[] 变量?
我经常使用 Request.QueryString[]
变量。
在我的 Page_load
中,我经常做这样的事情:
int id = -1;
if (Request.QueryString["id"] != null) {
try
{
id = int.Parse(Request.QueryString["id"]);
}
catch
{
// deal with it
}
}
DoSomethingSpectacularNow(id);
这一切看起来有点笨拙和垃圾。 您如何处理您的 Request.QueryString[]
?
I frequently make use of Request.QueryString[]
variables.
In my Page_load
I often do things like:
int id = -1;
if (Request.QueryString["id"] != null) {
try
{
id = int.Parse(Request.QueryString["id"]);
}
catch
{
// deal with it
}
}
DoSomethingSpectacularNow(id);
It all seems a bit clunky and rubbish. How do you deal with your Request.QueryString[]
s?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
哎呀,这是一个业力风险...
我有一个 DRY 可单元测试的抽象,因为,因为有太多的查询字符串变量无法在遗留转换中保留。
下面的代码来自一个实用程序类,其构造函数需要 NameValueCollection 输入 (this.source) 和字符串数组“keys”,因为旧版应用程序相当有机,并且已经开发了将多个不同字符串作为潜在输入键的可能性。 不过我有点喜欢可扩展性。 此方法检查集合中的键并以所需的数据类型返回它。
Eeee this is a karma risk...
I have a DRY unit-testable abstraction because, well, because there were too many querystring variables to keep on in a legacy conversion.
The code below is from a utility class whose constructor requires a NameValueCollection input (this.source) and the string array "keys" is because the legacy app was rather organic and had developed the possibility for several different strings to be a potential input key. However I kind of like the extensibility. This method inspects the collection for the key and returns it in the datatype required.
我实际上有一个实用程序类,它使用泛型来“包装”会话,它为我完成所有“繁重工作”,我还有一些几乎相同的用于处理 QueryString 值的东西。
这有助于消除(通常是大量)检查的代码重复。
例如:
注意:
这显然使用了静态,有些人不喜欢静态,因为它会影响测试代码..您可以轻松地重构为基于实例和您需要的任何接口工作的东西。.我只是认为静态示例是最轻的。
希望这能有所帮助/引人深思。
I actually have a utility class that uses Generics to "wrap" session, which does all of the "grunt work" for me, I also have something almost identical for working with QueryString values.
This helps remove the code dupe for the (often numerous) checks..
For example:
NOTE:
This obviously makes use of statics, which some people don't like because of the way it can impact test code.. You can easily refactor into something that works based on instances and any interfaces you require.. I just think the statics example is the lightest.
Hope this helps/gives food for thought.
我确实为每个函数都有函数(实际上它是一个小类,有很多静态数据):
GetIntegerFromQuerystring(val)
GetIntegerFromPost(val)
....
code>如果失败则返回 -1(这对我来说几乎总是可以的,我还有一些其他负数函数)。
I do have functions for each (actually it's one small class, with lots of statics):
GetIntegerFromQuerystring(val)
GetIntegerFromPost(val)
....
It returns -1 if fails (which is almost always OK for me, I have some other functions for negative numbers as well).
我修改了 Bryan Watts 的答案,以便如果您询问的参数不存在并且您指定了可为 null 的类型,它将返回 null :
您现在可以执行以下操作:
I modified Bryan Watts' answer so that if the param your asking does not exist and you have specified a nullable type it will return null :
You can now do this :
下面是一个扩展方法,允许您编写如下代码:
它使用
TypeDescriptor
来执行转换。 根据您的需要,您可以添加一个采用默认值而不是抛出异常的重载:Below is an extension method that will allow you to write code like this:
It makes use of
TypeDescriptor
to perform the conversion. Based on your needs, you could add an overload which takes a default value instead of throwing an exception:使用 int.TryParse 代替来摆脱 try-catch 块:
Use int.TryParse instead to get rid of the try-catch block:
试试这个家伙...
然后你将能够通过...轻松地在他中搜索字符串...
Try this dude...
Then you will be able to search the guy for a string real easy via...
我正在使用一个小辅助方法:
此方法允许我通过以下方式从查询字符串中读取值:
I'm using a little helper method:
This method allows me to read values from the query string in the following way:
一方面,请使用 int.TryParse 代替......
当然,假设“不存在”应该具有与“不是整数”相同的结果。
编辑:在其他情况下,当您无论如何都要使用请求参数作为字符串时,我认为验证它们是否存在绝对是个好主意。
Well for one thing use int.TryParse instead...
That assumes that "not present" should have the same result as "not an integer" of course.
EDIT: In other cases, when you're going to use request parameters as strings anyway, I think it's definitely a good idea to validate that they're present.
您也可以使用下面的扩展方法,并像这样
// 扩展方法
You can use the extension methods below as well and do like this
// Extension methods