我经常使用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[]
的?
下面是一个扩展方法,允许您编写如下代码:
int id = request.QueryString.GetValue("id"); DateTime date = request.QueryString.GetValue ("date");
它TypeDescriptor
用于执行转换.根据您的需要,您可以添加一个重载,该重载采用默认值而不是抛出异常:
public static T GetValue(this NameValueCollection collection, string key) { if(collection == null) { throw new ArgumentNullException("collection"); } var value = collection[key]; if(value == null) { throw new ArgumentOutOfRangeException("key"); } var converter = TypeDescriptor.GetConverter(typeof(T)); if(!converter.CanConvertFrom(typeof(string))) { throw new ArgumentException(String.Format("Cannot convert '{0}' to {1}", value, typeof(T))); } return (T) converter.ConvertFrom(value); }
使用int.TryParse来取消try-catch块:
if (!int.TryParse(Request.QueryString["id"], out id)) { // error case }
试试这个家伙......
Listkeys = new List (Request.QueryString.AllKeys);
然后你就可以通过...搜索这个家伙了.
keys.Contains("someKey")
我正在使用一个小帮手方法:
public static int QueryString(string paramName, int defaultValue) { int value; if (!int.TryParse(Request.QueryString[paramName], out value)) return defaultValue; return value; }
此方法允许我以下列方式从查询字符串中读取值:
int id = QueryString("id", 0);
好吧,有一件事使用int.TryParse而不是......
int id; if (!int.TryParse(Request.QueryString["id"], out id)) { id = -1; }
这假设"不存在"应该与"非整数"当然具有相同的结果.
编辑:在其他情况下,当你打算将请求参数用作字符串时,我认为验证它们是否存在肯定是一个好主意.
您也可以使用下面的扩展方法,并执行此操作
int? id = Request["id"].ToInt(); if(id.HasValue) { }
//扩展方法
public static int? ToInt(this string input) { int val; if (int.TryParse(input, out val)) return val; return null; } public static DateTime? ToDate(this string input) { DateTime val; if (DateTime.TryParse(input, out val)) return val; return null; } public static decimal? ToDecimal(this string input) { decimal val; if (decimal.TryParse(input, out val)) return val; return null; }