2

我被困在我认为是一个非常简单的问题上。如果 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());
            }
4

6 回答 6

7

你需要德摩根定律。当您反转您的条件时,您的 OR 需要变为 AND

于 2013-11-01T16:23:29.373 回答
6

!使用("not")反转您的陈述:

if(!(conditions)) { }

这将避免使用空代码块的需要,您只需删除else.

当您不在移动设备上或您的用户代理包含以下任何字符串时,您的第二个代码块将重定向。这取决于您的输入和您的环境。

请注意,创建可能性集合并检查您的用户代理是否在其中要容易得多:

if(new[] {"iphone", "somephone", "otherphone" }.Any(x => useragent.Contains(x))) {}
于 2013-11-01T16:18:57.420 回答
4

至少有一个条件不成立,这将永远是真的。例如,如果 strUserAgent.Contains("blackberry") 为真,则 strUserAgent.Contains(iphone) 将为假。

您需要将 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());
        }
于 2013-11-01T16:23:17.820 回答
2

不是答案,只是建议。您可以使用扩展方法使代码更简洁:

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"))
{
     //
}
于 2013-11-01T16:32:33.653 回答
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());
        }
于 2013-11-01T16:22:27.347 回答
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());
        }
于 2013-11-01T16:23:11.277 回答