RouteData.Values [“Language”]。ToString()生成空异常

时间:2012-08-06 04:35:57

标签: c# asp.net url-routing

我在多语言项目中实现了URL路由,我的链接看起来像这样

1>使用网址路由http://www.example.com/Default.aspx?page=1&Language=en-US 2 - ;使用网址路由http://www.example.com/1/en-US

3>第三种情况可以是http://www.example.com/Default.aspxhttp://www.example.com

我可以检查查询字符串是否为null或者RouteData值是否为空

但在3种情况下我必须检测浏览器默认语言&根据它重定向。

如果我把我的代码编写为

if (!string.IsNullOrEmpty(Request["Language"]))
  {
   lang = Request["Language"].ToString();
  }
if (!string.IsNullOrEmpty(HttpContext.Current.Request.RequestContext.RouteData.Values["Language"].ToString()))
 {
    lang = HttpContext.Current.Request.RequestContext.RouteData.Values["Language"].ToString();
 }

如果Route Data为空Object reference not set to an instance of an object

,则会生成以下错误

如何使用try catch block

使这个语句处理null异常
HttpContext.Current.Request.RequestContext.RouteData.Values["Language"].ToString();

2 个答案:

答案 0 :(得分:3)

您可以使用RouteValueDictionary.ContainsKey代替string.IsNullOrEmpty()

目前正在发生的事情是,string.IsNullOrEmpty()需要一个字符串,所以,你自然会在RouteData上调用.ToString()。但是,您在空对象上调用.ToString(),这会导致您的错误。我会像这样重写它:

if (HttpContext.Current.Request.RequestContext.RouteData.Values.ContainsKey("Language")) {
    // .. process it here
}

答案 1 :(得分:0)

如果.Values["Language"]正在生成null,您可以像这样检查:

if(HttpContext.Current.Request.RequestContext.RouteData != null)
{
    var value = HttpContext.Current.Request.RequestContext.RouteData.Values["Language"];
    lang = value == null ? null : value.ToString();
}