web-dev-qa-db-ja.com

割り当てられていない変数がRequest.QueryStringに存在するかどうかを確認します

ASP.NETページのコンテキスト内で、Request.QueryStringを使用して、URIのクエリ文字列部分のキーと値のペアのコレクションを取得できます。

たとえば、http://local/Default.aspx?test=valueを使用してページをロードすると、次のコードを呼び出すことができます。

//http://local/Default.aspx?test=value

protected void Page_Load(object sender, EventArgs e)
{
    string value = Request.QueryString["test"]; // == "value"
}

理想的には、testが存在するかどうかを確認して、http://local/Default.aspx?testを使用してページを呼び出すことができます。そして、クエリ文字列にテストが存在するかどうかを示すブール値を取得します。このようなもの:

//http://local/Default.aspx?test

protected void Page_Load(object sender, EventArgs e)
{
    bool testExists = Request.QueryString.HasKey("test"); // == True
}

したがって、理想的には、テスト変数が文字列に存在するかどうかを示すブール値が必要です。

正規表現を使用して文字列をチェックできると思いますが、誰かがよりエレガントな解決策を持っているかどうか知りたいと思いました。

私は以下を試しました:

//http://local/Default.aspx?test

Request.QueryString.AllKeys.Contains("test"); // == False  (Should be true)
Request.QueryString.Keys[0];                  // == null   (Should be "test")
Request.QueryString.GetKey(0);                // == null   (Should be "test")

この動作は、たとえばPHPとは異なります。

$testExists = isset($_REQUEST['test']); // == True
18
Aaron Blenkush

Request.QueryString.GetValues(null)は、値のないキーのリストを取得します

Request.QueryString.GetValues(null).Contains("test")はtrueを返します

25
Joe

このタスクを解決するための拡張メソッドを書きました。

public static bool ContainsKey(this NameValueCollection collection, string key)
{
    if (collection.AllKeys.Contains(key)) 
        return true;

     // ReSharper disable once AssignNullToNotNullAttribute
    var keysWithoutValues = collection.GetValues(null);
    return keysWithoutValues != null && keysWithoutValues.Contains(key);
}
5
Dark Daskin

私はこれを使います。

if (Request.Params["test"] != null)
{
    //Is Set
}
else if(Request.QueryString.GetValues(null) != null && 
       Array.IndexOf(Request.QueryString.GetValues(null),"test") > -1)
{
    //Not set
}
else
{
    //Does not exist
}
2
Dtagg

_Request.QueryString_はNameValueCollectionですが、項目が追加されるのは、クエリ文字列が通常の_[name=value]*_形式の場合のみです。そうでない場合は、空です。

QueryStringが_?test=value_の形式である場合、Request.QueryString.AllKeys.Contains("test")は必要な処理を実行します。そうしないと、_Request.Url.Query_で文字列操作を実行できなくなります。

2
Oren Melzer