我坚持认为这是一个非常容易的问题。如果UserAgent不包含一系列字符串,我试图将用户重定向到另一个网站。我无法弄清楚的部分是if语句在我使用下面的代码时工作正常。我对这个结果感到满意,但有些东西告诉我,如果声明证明是真的,那么只有一个else语句并且什么都不执行是不好的做法。
string strUserAgent = Request.UserAgent.ToString().ToLower();
if (strUserAgent != null)
{
if (Request.Browser.IsMobileDevice == true ||
strUserAgent.Contains("iphone") ||
strUserAgent.Contains("blackberry") ||
strUserAgent.Contains("mobile") ||
strUserAgent.Contains("windows ce") ||
strUserAgent.Contains("opera mini") ||
strUserAgent.Contains("palm") ||
strUserAgent.Contains("android"))
{
// Is this normal practice to only have an else block?
}else
{
Response.Redirect(AppState["redirectBack"].ToString());
}
当我尝试下一个代码块时,无论UserAgent字符串包含什么,脚本都会重定向用户。有人可以解释为什么会发生这种情况吗?
string strUserAgent = Request.UserAgent.ToString().ToLower();
if (strUserAgent != null)
{
if (Request.Browser.IsMobileDevice != true ||
!strUserAgent.Contains("iphone") ||
!strUserAgent.Contains("blackberry") ||
!strUserAgent.Contains("mobile") ||
!strUserAgent.Contains("windows ce") ||
!strUserAgent.Contains("opera mini") ||
!strUserAgent.Contains("palm") ||
!strUserAgent.Contains("android"))
{
Response.Redirect(AppState["redirectBack"].ToString());
}
答案 0 :(得分:6)
使用!
(“not”)反转您的陈述:
if(!(conditions)) { }
这样可以避免使用空代码块,只需删除else
。
当您不在移动设备上或当您的useragent包含以下任何字符串时,您的第二个代码块将重定向。这取决于您的输入和环境。
请注意,创建一系列可能性并检查您的使用者是否在那里更容易:
if(new[] {"iphone", "somephone", "otherphone" }.Any(x => useragent.Contains(x))) {}
答案 1 :(得分:6)
您需要De Morgan's Law。当你改变你的状态时,你的OR需要成为ANDs
答案 2 :(得分:3)
至少有一个条件是不正确的,这总是正确的。例如,如果strUserAgent.Contains(“blackberry”)为true,则strUserAgent.Contains(iphone)将为false。
您需要将OR(||
)运算符更改为逻辑AND(&&
)运算符。
if (strUserAgent != null)
{
if (Request.Browser.IsMobileDevice != true &&
!strUserAgent.Contains("iphone") &&
!strUserAgent.Contains("blackberry") &&
!strUserAgent.Contains("mobile") &&
!strUserAgent.Contains("windows ce") &&
!strUserAgent.Contains("opera mini") &&
!strUserAgent.Contains("palm") &&
!strUserAgent.Contains("android"))
{
Response.Redirect(AppState["redirectBack"].ToString());
}
答案 3 :(得分:1)
不是答案,只是一个建议。您可以使用扩展方法使代码更清晰:
public static bool ContainsAnyOf(this string source, params string[] strings)
{
return strings.Any(x => source.Contains(x));
}
现在写
if (strUserAgent.ContainsAnyOf("iphone", "blackberry", "mobile", "windows ce", "opera mini", "palm", "android"))
{
//
}
答案 4 :(得分:0)
你需要扭转整个事情。放!A || !B
与!(A||B)
不同。在第一个如果是A然后它不是B所以它是 True 。在第二个中,它是 False 。
if (!(Request.Browser.IsMobileDevice == true ||
strUserAgent.Contains("iphone") ||
strUserAgent.Contains("blackberry") ||
strUserAgent.Contains("mobile") ||
strUserAgent.Contains("windows ce") ||
strUserAgent.Contains("opera mini") ||
strUserAgent.Contains("palm") ||
strUserAgent.Contains("android")
) )
{
Response.Redirect(AppState["redirectBack"].ToString());
}
答案 5 :(得分:0)
string strUserAgent = Request.UserAgent.ToString().ToLower();
if (strUserAgent != null)
{
if (!(Request.Browser.IsMobileDevice == true ||
strUserAgent.Contains("iphone") ||
strUserAgent.Contains("blackberry") ||
strUserAgent.Contains("mobile") ||
strUserAgent.Contains("windows ce") ||
strUserAgent.Contains("opera mini") ||
strUserAgent.Contains("palm") ||
strUserAgent.Contains("android")))
{
Response.Redirect(AppState["redirectBack"].ToString());
}