2011-04-26 4 views
3

TabContainer에 모든 내용을 표시하는 페이지가 있지만 브라우저에서 JavaScript가 비활성화 된 경우 빈 페이지 만 표시됩니다.Asp.Net - 페이지에서 자바 스크립트가 감지되지 않습니까? (제목 변경)

모든 중요한 내용을 표시하기 위해 <noscript>을 추가 할 수 있지만 비어있는 TabContainer는 여전히 렌더링됩니다.

머리글에? noscript = true와 같은 페이지로 리디렉션하도록 추가하고 싶지만 무한대이면 안됩니다. 현재 url에 noscript 쿼리 값이 없을 때 적절한 <META HTTP-EQUIV="Refresh" CONTENT="0; URL=url?noscript=true">을 넣는 PlaceHolder 컨트롤을 사용하여 계산합니다.

그런 다음 noscript 쿼리 값이있는 경우 TabContainer에 대해 Visible 속성을 false로 설정할 수 있습니다.

올바른 방법인가요?

답변

0

글쎄, 내가 철저하고 코드를 복제하고 싶지 않기 때문에, 나는 다른 응답 플러스 세션과 이전 탐지를위한 viewstate를하는이 구성 요소를 만들었다.

구성 요소의 값은 다른 페이지에서 사용할 수 있으며 구성 요소가있는 다른 페이지에서 사용 된 것과 동일한 세션/쿠키 값에 액세스 할 수 있다는 것입니다.

개선을위한 제안 사항은 무엇입니까?

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>"); 
     } 
    } 
} 
} 
0

나는 여전히 다른 사람들이 생각하는 것에 관심이있어서 Asp.Net에 꽤 새로운 방법을 생각해 냈습니다.

편집 : 내가 브라우저가 노 스크립트가 있으면 그래서 우리는 같은 페이지로 리디렉션 유지하지 않아도 기억 임시 (세션 만) 쿠키를 도입하여 아이디어를 확장, 우리는 그냥 부울 값을 사용 다음에 페이지가 요청 될 때

나는 마스터 페이지의 머리에서 이런 짓을 :

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

를있는 TabContainer의 Visible="<%# !NoJavascript %>" 재산에서. 그런 다음 코드 숨김에서

:

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; 
    } 
} 

다른 아이디어?

향후 생각 : 쿠키가 활성화되어 있지 않으면 각 요청에 noscript 쿼리 값을 전달하는 유틸리티가 도움이 될 것입니다. 그렇지 않으면 각 요청에서 동일한 페이지로 계속 리디렉션됩니다.

1

브라우저에 대한 정보를 얻을 수 HttpBrowserCapabilitites 클래스를 사용할 수 있습니다, 자바 스크립트 지원을 확인하는 속성이 EcmaScriptVersion라고합니다. 버전이 1 이상이면 브라우저가 JavaScript를 지원합니다.

+1

자바 스크립트가 사용자에 의해 사용 중지되었거나 내가 틀렸다면 브라우저가 지원하는 것과 다르지 않습니까? –

+0

예, 당신의 권리 ... 죄송합니다 ... JS가 꺼져있는 경우 뭔가를 숨기려면 dispaly : none; CSS에서 기본적으로 숨 깁니다. 그런 다음 페이지에서 일부 JS를 실행하여 요소를 표시 할 수있는 특성을 제거 할 수 있습니다. 이렇게하면 HTML이 렌더링되지만 JS가 활성화되어 있지 않으면 사용에서 완전히 숨겨져 야합니다. – Zachary

+0

그래서이 구성 요소를 생각해 냈습니다.그것은 JS가 비활성화되어 있는지 감지하고 그에 따라 행동 할 수있게 해줍니다. –

관련 문제