0

这段代码应该怎么写?我在if (!query.Keys[i].Contains("ddl"))上得到对象引用未设置为对象的实例

string getLink(int toPage)
{
    NameValueCollection query = HttpUtility.ParseQueryString(Request.Url.Query);
    query["p"] = toPage.ToString();

    string url = Request.Path;
    int count = query.Count;

    for (int i = 0; i < count; i++)
    {
        if (!query.Keys[i].Contains("ddl"))
            url += string.Format("{0}{1}={2}",
                i == 0 ? "?" : "&",
                query.Keys[i],
                query.Keys[i] == "category" ? string.Join("TTT", query.GetValues(i)).Replace(" ", "+") : string.Join(",", query.GetValues(i)));
    }
4

5 回答 5

2

如前所述,检查空值。以下是一个极端的检查,但安全总比抱歉好。

for (int i = 0; i < count; i++) {
    if (query != null &&
        query.Keys != null &&
        i < query.Keys.Count &&
        query.ContainsKey(i) &&
        query.Keys[i] != null &&
        query.GetValues(i) != null &&
        !query.Keys[i].Contains("ddl"))  {
            url += string.Format(
                "{0}{1}={2}",
                i == 0 ? "?" : "&",
                query.Keys[i],
                query.Keys[i] == "category" ? string.Join("TTT", query.GetValues(i)).Replace(" ", "+") : string.Join(",", query.GetValues(i)));
    }
}
于 2013-08-06T18:05:25.713 回答
2

您可以将其重写为

if (query!=null && query.ContainsKey(i) && !query.Keys[i].Contains("ddl")) 
于 2013-08-06T18:06:04.903 回答
1

调试您的应用程序;在导致异常的行中设置断点。

  • 如果查询为空,请检查第一次迭代。
  • 如果 query.Keys[i] 为空,请检查每次迭代

在调试模式下,您还可以检查问题发生的迭代(已经 i==0 或更高版本?)。否则,在不知道发生了什么的情况下很难说清楚。

我也不知道您如何期望除您之外的任何其他人将能够在两年内维护 if 语句下方的代码......简化它可能是有意义的。

于 2013-08-06T18:09:42.207 回答
0

我认为初始化可能有问题

  NameValueCollection query = HttpUtility.ParseQueryString(Request.Url.Query);

可能有问题

HttpUtility.ParseQueryString(Request.Url.Query)

部分代码。

于 2013-08-06T22:32:13.487 回答
0

我不知道你的代码,但看起来你可以简单地重写你的 for 循环

for (int i = 0; i < query.Count-1; i++)
{



}

取决于目的count。由于超出了字典的长度,您很可能会遇到错误。这将解决该问题。

于 2013-08-06T18:09:07.207 回答