3

TabContainerにすべてのコンテンツを表示するページがありますが、ブラウザーでjavascriptが無効になっていると、空白のページが表示されます。

を追加し<noscript>てすべての重要なコンテンツを表示できますが、空白のTabContainerは引き続きレンダリングされます。

同じページにリダイレクトするためにヘッダーにaと?noscript = trueを追加したいのですが、無限であってはなりません。<META HTTP-EQUIV="Refresh" CONTENT="0; URL=url?noscript=true">現在のURLにnoscriptクエリ値がない場合に適切なものを配置するPlaceHolderコントロールを使用して考えます。

次に、noscriptクエリ値が存在する場合、TabContainerのVisibleプロパティをfalseに設定できます。

これはそれについて行く正しい方法ですか?

4

3 に答える 3

1

HttpBrowserCapabilititesクラスを使用して、ブラウザーに関する情報を取得できます。JavaScriptのサポートを確認するためのプロパティは、EcmaScriptVersionと呼ばれます。バージョンが1より大きい場合、ブラウザはJavaScriptをサポートします。

于 2011-04-27T22:15:36.957 に答える
0

私は、Asp.Netにはまだかなり新しい、機能する方法を思いついたので、他の人の考えに興味があります。

編集ブラウザにNoScriptがあるかどうかを記憶する一時的な(セッションのみの)Cookieを導入することでアイデアを拡張したので、同じページにリダイレクトし続ける必要はありません。次にページがリクエストされたときにそのブール値を使用するだけです。 。

私はマスターページの先頭でこれを行いました:

<noscript>
  <%# NoScriptPlaceHolder %>
</noscript>

TabContainerのVisible="<%# !NoJavascript %>"プロパティ。

次に、CodeBehindで:

protected bool NoJavascript
{
    get 
    {
        TempCookie cookie = new TempCookie(); // session only cookie
        if (cookie.NoJavascript) return true;
        bool noJavascript = !string.IsNullOrEmpty(Request["noscript"]);
        if (noJavascript)
            cookie.NoJavascript = noJavascript;
        return noJavascript;
    }
}

protected string NoScriptPlaceHolder
{
    get
    {
        if (NoJavascript)
            return string.Empty;
        string url = Request.Url.ToString();
        string adv = "?";
        if (url.Contains('?'))
            adv = "&";
        string meta = string.Format("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL={0}{1}noscript=true\">",
            url, adv);
        return meta;
    }
}

他のアイデアはありますか?

将来の考え:Cookieが有効になっていない場合は、noscriptクエリ値を各リクエストに渡すユーティリティも役立つと思います。そうでない場合は、リクエストごとに同じページに継続的にリダイレクトされます。

于 2011-04-26T02:42:39.623 に答える
0

さて、私は徹底していて、コードを複製したくないので、他の答えを実行し、以前の検出のためにセッションとビューステートをチェックするこのコンポーネントを作成しました。

コンポーネントの価値は、他のページで使用でき、コンポーネントの他のページで使用されたのと同じセッション/Cookie値にアクセスできることです。

改善のための提案はありますか?

using System;
using System.ComponentModel;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace AspNetLib.Controls
{
/*
 * This component should be placed in the <head> html tag and not in the body or form.
 */
[DefaultProperty("Noscript")]
[ToolboxData("<{0}:NoJavascript runat=server />")]
public class NoJavascript : WebControl
{
    HttpRequest Request = HttpContext.Current.Request;
    HttpSessionState Session = HttpContext.Current.Session;
    HttpResponse Response = HttpContext.Current.Response;

    [Bindable(true)]
    [Category("Appearance")]
    [DefaultValue(false)]
    [Localizable(true)]
    public bool Noscript
    {
        get
        {
            bool noscript;
            // check if we've detected no script before
            try
            {
                noscript = Convert.ToBoolean(Session["js:noscript"] ?? false);
                if (noscript) return true;
            }
            catch { } // if session disabled, catch its error
            HttpCookie Cookie = Request.Cookies["JavascriptDetectionComponent"];
            if (null != Cookie)
            {
                noscript = !string.IsNullOrEmpty(Cookie["js:noscript"]);
                if (noscript) return true;
            }
            noscript = Convert.ToBoolean(ViewState["js:noscript"] ?? false);
            if (noscript) return true;

            // if we've returned from meta evaluate noscript query setting
            noscript = !string.IsNullOrEmpty(Request["noscript"]);
            if (noscript)
            {
                SetNoScript();
                return true;
            }
            return false;
        }
    }

    [Bindable(true)]
    [Category("Misc")]
    [DefaultValue("")]
    [Localizable(true)]
    public string CookieDomain
    {
        get { return Convert.ToString(ViewState["CookieDomain"] ?? string.Empty); }
        set { ViewState["CookieDomain"] = value; }
    }

    private void SetNoScript()
    {
        try { Session["js:noscript"] = true; }
        catch { }// if session disabled, catch its error
        ViewState["js:noscript"] = true;
        HttpCookie Cookie = new HttpCookie("JavascriptDetectionComponent");
        if (!string.IsNullOrEmpty(CookieDomain))
            Cookie.Domain = CookieDomain;
        Cookie["js:noscript"] = "true";
        Response.Cookies.Add(Cookie);
    }

    protected override void RenderContents(HtmlTextWriter output)
    {
        if (!Noscript)
        {
            string url = Request.Url.ToString();
            string adv = "?";
            if (url.Contains('?'))
                adv = "&";
            string meta = string.Format("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL={0}{1}noscript=true\">",
                url, adv);
            output.WriteLine("<noscript>");
            output.WriteLine("  " + meta);
            output.WriteLine("</noscript>");
        }
    }
}
}
于 2011-04-27T21:37:51.850 に答える