我很好奇每个人在ASP.NET中处理/抽象QueryString的工作.在我们的一些网络应用程序中,我在网站上看到了很多这样的内容:
int val = 0; if(Request.QueryString["someKey"] != null) { val = Convert.ToInt32(Request.QueryString["someKey"]); }
有什么更好的方法来处理这种严重性?
我倾向于将它们抽象为属性的想法.例如:
public int age { get { if (Request.QueryString["Age"] == null) return 0; else return int.Parse(Request.QueryString["Age"]); } }
如果您愿意,可以添加更多验证.但我倾向于喜欢用这种方式包装我的所有查询字符串变量.
编辑:---另外,另一张海报指出,你必须在每一页上创建这些属性.我的回答是你没有.您可以在一个可以调用"QueryStrings"或类似内容的类中创建这些属性.然后,您可以在要访问查询字符串的每个页面中实例化此类,然后您可以执行类似的操作
var queryStrings = new QueryStrings(); var age = queryStrings.age;
这样,您就可以封装所有逻辑,以便在单个可维护位置访问和处理每种类型的查询变量.
EDIT2:---因为它是类的一个实例,你也可以使用依赖注入在你使用它的每个地方注入QueryStrings类. StructureMap做得很好.这也允许您模拟QueryStrings类并注入,如果您想进行自动单元测试.比ASP.Net的Request对象更容易模拟它.
有一点是你没有在这里捕捉空白值.您可能有一个类似" http://example.com?someKey=&anotherKey=12345 " 的网址,在这种情况下,"someKey"参数值为""(空).您可以使用string.IsNullOrEmpty()来检查null和empty状态.
我还将"someKey"更改为存储在变量中.这样你就不会在多个地方重复文字字符串.它使这更容易维护.
int val = 0; string myKey = "someKey"; if (!string.IsNullOrEmpty(Request.QueryString[myKey])) { val = int.Parse(Request.QueryString[myKey]); }
我希望有所帮助!
伊恩