3

仕事用の検索ツールを修正しようとしています。ASP.NETに出会ったのはこれが初めてです。現在の検索ツールには、ローカルディレクトリを検索する方法の3つのオプションを含むラジオボタンリストがあります。しかし、私の前にこのプロジェクトに取り組んだ人は、コードを完成させなかったため、辞めました。ラジオボタンは、どのオプションを選択しても同じであることに気付いたので、検索クエリには影響しません。

これは、検索機能を書き直して、3つのラジオボタンオプションを組み込む試みです。ただし、この関数をコードの残りの部分に組み込むと、ページがまったくレンダリングされず、エラーが発生しません。元の文字列を取得し、Containsステートメントを省略してバリエーションを作成したため、クエリ文字列に誤りがあったとは思いません。エラーは、ifステートメント、またはasp.netRadioButtonListListItem値を比較しようとしている方法に起因すると想定しています。

protected void btnclick_WorkspaceSearch(object sender, EventArgs e){
    string strSearchTerm=tbSearch.Text.Trim() 

    if (rblSearchOption.SelectedValue == "all"){
        // Find the search term in either a file name or file content
        string indexQuery = "SELECT docauthor,doctitle, FileName, Path, Write, Size, Rank";
        indexQuery += "FROM " + "Workspace" + "..SCOPE() WHERE ";
        indexQuery += "CONTAINS(FileName, '\"" + strSearchTerm + "\"') ";
        indexQuery += "OR CONTAINS(Contents, '\"" + strSearchTerm + "\"') ";
        indexQuery += "ORDER BY Rank DESC";
    }
    if (rblSearchOption.SelectedValue=="names"){
        // Find the search term in a file name 
        string indexQuery = "SELECT docauthor,doctitle, FileName, Path, Write, Size, Rank";
        indexQuery += "FROM " + "Workspace" + "..SCOPE() WHERE ";
        indexQuery += "CONTAINS(FileName, '\"" + strSearchTerm + "\"') ";
        indexQuery += "ORDER BY Rank DESC";
    }
    if (rblSearchOption.SelectedValue =="contents") {
        // Find the search term in a file's content
        string indexQuery = "SELECT docauthor,doctitle, FileName, Path, Write, Size, Rank";
        indexQuery += "FROM " + "Workspace" + "..SCOPE() WHERE ";
        indexQuery += "CONTAINS(FileName, '\"" + strSearchTerm + "\"') ";
        indexQuery += "ORDER BY Rank DESC";
    }
    searchIndex(indexQuery);
    lit_strQueryString.Text = indexQuery;
}
4

2 に答える 2

0

私は問題を理解しました。コメントしてくれた人たちのために、あなたの入力に感謝します。私は潜在的なエラーを修正するのを助けるためにいくつかの必要な変更を加えました。listItem値を比較するための元の質問については、私が使用した行は次のとおりです。

if (rblSearchOption.SelectedItem.Value =="contents"){
//logic here
}

私は以前にこれを試しましたが、うまくいきませんでした。コメントで指摘された誤りのためだと思います。

追記(コメントに基づく):上記のコードには;がありません。1行目

文字列インデックスクエリは、ifステートメントの外部で宣言および開始する必要があります。

もう一度私を助けようとした人たちに感謝します。

于 2012-12-27T19:06:36.653 に答える
0

問題が少し無関係であることがわかってよかったですが、コードを見ると、深刻なリファクタリングが必要だと思います。このコードは次のように簡略化できます。

1)switchステートメントを使用します。これは、コードとは異なり、ラジオボタンリストの選択された値を1回だけ評価するのに役立ちます。

2)StringBuilderを使用してクエリを作成する

3)繰り返しの削除-名前内容の追加ロジックはまったく同じです。2つのcase式を使用し、実行するステートメントを1つ指定することで、繰り返しを削除できます。

  System.Text.StringBuilder indexQuery = new System.Text.StringBuilder();
  indexQuery.Append("SELECT docauthor,doctitle, FileName, Path, Write, Size, Rank FROM Workspace..SCOPE() WHERE ");

    switch(rblSearchOption.SelectedItem.Value)
    {
        case "all":
        indexQuery.AppendFormat("CONTAINS(FileName,'{0}') ",strSearchTerm);
        indexQuery.AppendFormat("OR CONTAINS(Contents,'{0}')",strSearchTerm);
        indexQuery.AppendLine("ORDER BY Rank DESC");
            break;
        case "names":
        case "contents":
        indexQuery.AppendFormat("CONTAINS(FileName,'{0}')",strSearchTerm);
        indexQuery.Append("ORDER BY Rank DESC");
            break;
    }

    searchIndex(indexQuery.ToString());
    lit_strQueryString.Text = indexQuery;
于 2012-12-28T05:51:57.890 に答える