2

本当に簡単な問題だと思っていた問題に行き詰まっています。UserAgent に一連の文字列が含まれていない場合、ユーザーを別の Web サイトにリダイレクトしようとしています。私が理解できない部分は、以下のコードを使用すると if ステートメントが正常に機能することです。この結果には満足していますが、else ステートメントだけを使用して、ステートメントが true であることが証明された場合に何も実行しないのは良い習慣ではないことがわかりました。

        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.

2 番目のコードブロックは、モバイル デバイスを使用していない場合、またはユーザー エージェントに次のいずれかの文字列が含まれている場合にリダイレクトされます。入力と環境によって異なります。

可能性のコレクションを作成し、ユーザーエージェントがそこにあるかどうかを確認する方がはるかに簡単であることに注意してください。

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

条件の少なくとも 1 つが真でないことは常に真です。たとえば、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());
        }
于 2013-11-01T16:23:17.820 に答える
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 に答える
0

全体を逆にする必要があります。パッティング!A || !Bは と同じではありません!(A||B)。最初のもので A の場合、 B ではないのでTrueです。2 つ目は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 に答える