簡體   English   中英

使用C#檢查url中是否存在非值查詢字符串

[英]Check if non-valued query string exists in url with C#

我已經看到了一些如何使用C#檢查URL中是否存在查詢字符串的示例:

www.site.com/index?query=yes

if(Request.QueryString["query"]=="yes")

但是如何在沒有參數的情況下檢查字符串呢? 我只需要看看它是否存在。

www.site.com/index?query

if(Request.QueryString["query"] != null) //why is this always null?

我知道可能有一個簡單的答案,我會覺得愚蠢,但我還沒有找到它。 謝謝!

如果未指定值,則該鍵將自動設置為null,因此您無法檢查其是否存在。

為了檢查該值是否實際存在,如果它包含您的Key ,則可以檢入等於null集合:

Request.QueryString.GetValues(null).Contains("query")

它返回null因為在該查詢字符串中它沒有該鍵的值。 我認為您正在尋找的支票是這樣的:

if(Request.QueryString.Keys.OfType<string>().Any(k => k == "query"))

甚至:

if(Request.QueryString.AllKeys.Any(k => k == "query"))

后者可能更合適,因為該數組已經被緩存。

Ludovic有正確的答案。 但我想提供一個更強大的版本。

var valueEntries = Request.QueryString.GetValues((string)null) ?? new string[] {};
if (valueEntries.Contains("query", StringComparer.OrdinalIgnoreCase))
{
    // value is specify in querystring
}
else
{
    // value is NOT specify in querystring
}

由於Ludovic的回答,這是檢查它的最快方法

if(Request.QueryString.GetValues(null)?.Contains("query")??false)

這很冗長,而且很有效。 這是一個.NET小提琴。

@using System.Linq;

@{
    var empties = Request.Url.Query
        .Split('&')
        .Where(s => !s.Contains("=") || s.Last() == '=');

    var keyExistsAndIsEmpty = empties.Any(x => x.Contains("target-key")
}

事實證明,如果值為null,則QueryString集合中的鍵也為null。 您最好的選擇就是為查詢分配一個值。 可能有一種方法可以重命名參數,以便更具語義感。 例如,而不是www.site.com/index?getdocument=yes你可以做www.site.com/index?action=getdocument

但是,如果您仍然希望網址www.site.com/index?query正常工作,則有一種方法:根本不使用QueryString並手動解析URL:

string query = Request.RawUrl.Split('?')[1];
if (query == "query")
{
    // send the data
}

如果未提供“=”,則無法使用空檢查來確定密鑰是否存在,因為null表示密鑰不在查詢字符串中。

問題是“查詢”被視為具有空鍵的值,而不是具有空值的鍵。

在這種情況下,密鑰在Request.QueryString.AllKeys也為null。

我使用這種通用方法在使用它之前“修復”查詢字符串中的空鍵問題。 這不涉及手動解析字符串。

用法示例:

var fixedQueryString = GetFixedQueryString(Request.QueryString);
if (fixedQueryString.AllKeys.Contains("query"))
{
}

方法:

public static NameValueCollection GetFixedQueryString(NameValueCollection originalQueryString)
{
      var fixedQueryString = new NameValueCollection();

      for (var i = 0; i < originalQueryString.AllKeys.Length; i++)
      {
          var keyName = originalQueryString.AllKeys[i];

          if (keyName != null)
          {
              fixedQueryString.Add(keyName, originalQueryString[keyName]);
          }
          else
          {                       
              foreach (var keyWithoutValue in originalQueryString[i].Split(','))
              {
                  fixedQueryString.Add(keyWithoutValue, null);
              }              
          }
      }

      return fixedQueryString;
}

我更喜歡使用:

If(Request.QueryString.AllKeys.Contains("query")
{
    //
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM