[英]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.