在 c# 中将 .Contains() 与 Appsettings 键值一起使用
Using .Contains() with Appsettings key value in c#
我的 appsettings
-
低于 key value
<add key="BlockAMPPages" value="current.aspx, error.aspx, videos.aspx"/>
&想achieve
下面用上面的key value
-
如果我的 RedirectURL
包含以上任何一项 string [i.e.keyvalue]
那么我想 return false/or do nothing.
例如
RedirectURL- abc.mer.com/abc/error.aspx --> return exist
RedirectURL- abc.mer.com/abc/videos.aspx --> return exist
RedirectURL- abc.mer.com/abc/current.aspx --> return exist
RedirectURL- abc.mer.com/abc/post.aspx --> return not exist.
我在 C#
中尝试了以下代码,但没有成功-
RedirectURL.Contains(ConfigurationManager.AppSettings["BlockAMPPages"].ToString());
RedirectURL.Contains(ConfigurationManager.AppSettings["BlockAMPPages"].ToString().split(','));
提前致谢..!!
试试这个:
从您的配置值中删除空格:current.aspx,error.aspx,videos.aspx
。
虽然这样处理了,但是会减少一个额外的处理步骤Trim()
然后试试下面的代码:
string blockedPages = "current.aspx,error.aspx,videos.aspx";
string url = "abc.mer.com/abc/error.aspx";
var doesExist = blockedPages.Split(',').Any(x => url.Contains(x.Trim()));
Console.WriteLine(doesExist);
在您的第一次尝试中,您将 URL 与整个应用程序设置字符串进行匹配,而 URL 永远不会匹配值 current.aspx, error.aspx, videos.aspx
.
在您的第二个示例中,您将 RedirectURL
与整个元素数组进行匹配(这甚至可以编译吗?我目前没有 VS 可用于测试)。
您需要做的是将其与所有不同类型独立匹配,如下所示:
var urlSegmentsToBlock = ConfigurationManager.AppSettings["BlockAMPPages"].ToString().Split(',');
foreach(var urlSegment in urlSegmentsToBlock)
{
if(RedirectURL.Equals(urlSegment, StringComparison.InvariantCultureIgnoreCase))
return false;
}
return true;
此外,我会删除您的 appSetting 值中逗号后的多余空格,以避免必须 trim 您要匹配的字符串的末尾。所以让值是这样的:current.aspx, error.aspx, videos.aspx
.
您也可以使用 Any(...)
跳过 foreach 循环,但我将循环保留在那里以使概念更清楚。
简单的形式应该是这样的:
!ConfigurationManager.AppSettings["BlockAMPPages"].ToString().split(',').Any(pageName=>RedirectURL.Contains(pageName));
您应该Split
配置设置,然后您可以使用IndexOf
搜索匹配条件。此外,忽略区分大小写可能会更好。
var blockedPages = ConfigurationManager.AppSettings["BlockAMPPages"].Trim(' ').Split(',');
if (blockedPages.Any(x => RedirectURL.IndexOf(x, StringComparison.OrdinalIgnoreCase) > -1))
{
//the RedirectURL contains blocked page
}
else
{
}
我的 appsettings
-
key value
<add key="BlockAMPPages" value="current.aspx, error.aspx, videos.aspx"/>
&想achieve
下面用上面的key value
-
如果我的 RedirectURL
包含以上任何一项 string [i.e.keyvalue]
那么我想 return false/or do nothing.
例如
RedirectURL- abc.mer.com/abc/error.aspx --> return exist
RedirectURL- abc.mer.com/abc/videos.aspx --> return exist
RedirectURL- abc.mer.com/abc/current.aspx --> return exist
RedirectURL- abc.mer.com/abc/post.aspx --> return not exist.
我在 C#
中尝试了以下代码,但没有成功-
RedirectURL.Contains(ConfigurationManager.AppSettings["BlockAMPPages"].ToString());
RedirectURL.Contains(ConfigurationManager.AppSettings["BlockAMPPages"].ToString().split(','));
提前致谢..!!
试试这个:
从您的配置值中删除空格:current.aspx,error.aspx,videos.aspx
。
虽然这样处理了,但是会减少一个额外的处理步骤Trim()
然后试试下面的代码:
string blockedPages = "current.aspx,error.aspx,videos.aspx";
string url = "abc.mer.com/abc/error.aspx";
var doesExist = blockedPages.Split(',').Any(x => url.Contains(x.Trim()));
Console.WriteLine(doesExist);
在您的第一次尝试中,您将 URL 与整个应用程序设置字符串进行匹配,而 URL 永远不会匹配值 current.aspx, error.aspx, videos.aspx
.
在您的第二个示例中,您将 RedirectURL
与整个元素数组进行匹配(这甚至可以编译吗?我目前没有 VS 可用于测试)。
您需要做的是将其与所有不同类型独立匹配,如下所示:
var urlSegmentsToBlock = ConfigurationManager.AppSettings["BlockAMPPages"].ToString().Split(',');
foreach(var urlSegment in urlSegmentsToBlock)
{
if(RedirectURL.Equals(urlSegment, StringComparison.InvariantCultureIgnoreCase))
return false;
}
return true;
此外,我会删除您的 appSetting 值中逗号后的多余空格,以避免必须 trim 您要匹配的字符串的末尾。所以让值是这样的:current.aspx, error.aspx, videos.aspx
.
您也可以使用 Any(...)
跳过 foreach 循环,但我将循环保留在那里以使概念更清楚。
简单的形式应该是这样的:
!ConfigurationManager.AppSettings["BlockAMPPages"].ToString().split(',').Any(pageName=>RedirectURL.Contains(pageName));
您应该Split
配置设置,然后您可以使用IndexOf
搜索匹配条件。此外,忽略区分大小写可能会更好。
var blockedPages = ConfigurationManager.AppSettings["BlockAMPPages"].Trim(' ').Split(',');
if (blockedPages.Any(x => RedirectURL.IndexOf(x, StringComparison.OrdinalIgnoreCase) > -1))
{
//the RedirectURL contains blocked page
}
else
{
}