IT이야기

Framework 3.5에서 서버 태그 <%= %>로 Visible 속성 설정

cyworld 2021. 9. 30. 21:55
반응형

Framework 3.5에서 서버 태그 <%= %>로 Visible 속성 설정


저는 다음과 같이 runat="server" 컨트롤의 가시성을 설정하기 위해 <%=whatever %>와 같은 서버 태그를 사용하여 .NET Framework 4 프로젝트에서 작업했습니다.

  <div id="MyId" runat="server" visible="<%=MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

이것은 프레임워크 4에서 작동하지만 이제 프레임워크 3.5 프로젝트에서 이것을 사용하려고 하면 작동하지 않는 것 같습니다. 이것은 Framework 4 전용 기능입니까? 코드 숨김에서 가시성을 설정하는 가장 멋진(및 .aspx 측) 대안이 있습니까? 나는 못생긴 것을 사용하고 있습니다 :

    MiId.Visible = MyVisiblePropertyOnCodeBehind

미리 감사드립니다.

[편집됨] 솔루션:

내 문제와 솔루션을 이해하게 하는 귀하의 의견에 감사드립니다!

그것은 한 가지 이상에서 내 잘못이었습니다.

VS2010 프로젝트에서 <%= 대신 <%#을 사용했습니다.

또한 VS2010 프로젝트에서 "Page"가 아닌 CustomPage 클래스에서 상속된 페이지를 사용하고 있다는 사실을 눈치채지 못했습니다. 4.0 전용 기능.

여기에서 말했듯이 다음 마크업이 있는 경우:

  <div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

코드 숨김에 다음을 추가하여 작동하게 할 수 있습니다.

    public bool  MyVisiblePropertyOnCodeBehind = true;
    protected void Page_Load(object sender, EventArgs e) {
        DataBind();
        // Or if you want only for one control, MyId.DataBind();             
    }

내가 읽은 것처럼 이 DataBind()는 응용 프로그램의 성능을 저하시킬 수 있습니다. 얼마인지 아세요? 이것이 큰 프로젝트에 사용되는 "전문적인" 기술로 이해될 수 있습니까? 아니면 피해야 한다고 생각하십니까?

단일 보기에서 마크업을 읽고 이해하기 쉽게 만드는 방식이 마음에 들지만 느린 코드 때문에 죄책감을 느끼고 싶지는 않습니다.


게시한 코드는 ASP.NET 2.0 또는 ASP.NET 4.0 런타임의 서버 태그에 유효한 구문이 아닙니다. 두 버전 모두 <%= ... %>에서 서버 태그를 사용하여 visible 속성을 설정하려고 하면 파서 오류가 발생해야 합니다.

파서 오류 메시지: 'Visible' 속성에 대한 문자열 표현 '<%=MyVisiblePropertyOnCodeBehind%>'에서 'System.Boolean' 유형의 개체를 만들 수 없습니다.

Visible코드 숨김 또는 <script runat="server">태그 에서 속성을 설정하는 것 외에 두 가지 옵션이 있습니다 . 첫 번째는 Visible속성 에 대한 데이터 바인딩을 사용하는 것 입니다. 값을 바인딩하려면 부모 컨트롤 중 DataBind()하나 MyId또는 하나 에서 메서드 를 호출해야 합니다 .

<div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
</div>

다른 옵션은 다음과 같이 코드를 작성하는 것입니다.

<% if(MyVisiblePropertyOnCodeBehind) { %>
<div id="MyId" runat="server">
    Content
</div>
<% } %>

이 방법의 단점은 코드 블록이 포함된 페이지나 컨트롤에 프로그래밍 방식으로 컨트롤을 추가할 수 없다는 것입니다. 시도하면 오류가 발생합니다.

컨트롤에 코드 블록(예: <% ... %>)이 포함되어 있으므로 Controls 컬렉션을 수정할 수 없습니다.

그렇긴 해도 지금 하고 있는 방식으로 속성을 설정하는 것이 최선이라고 생각합니다.


다음과 같이 pageLoad 이벤트에서 변수를 true/false로 설정하기만 하면 됩니다.

private bool IsEditMode {get; set;}      

protected bool IsVisible 
{
    get { retun IsEditMode ;}
    set { IsEditMode =value;}
}  

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // based on some condition set this to true or false 
        isEditMode=true;
    }
}   

그런 다음 aspx 페이지 내의 컨트롤 속성에서 다음과 같은 속성을 통해 가시성을 설정합니다.

Visible="<%# !IsEditMode %>" 

As for ASP.NET aspx page's inline expression. <% %> can only be used at aspx page or user control's top document level, but can not be embeded in server control's tag attribute (such as <asp:Button... Text =<% %> ..>). As you've found you can create custom expression builder in ASP.NET 2.0 to add your inline expression.

BTW, another means for supplying values to server control properties in aspx inline tempalte is using <%# %> databinding expression. This is built-in supported. The only different from other inline expression is that method on the target control or its Container control.

Steven Cheng

Microsoft MSDN Online Support Lead

Full post here: http://www.aspnet-answers.com/microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

And workaround here: ASP.net Inline Expression Issue


Here is another approach which maintains the simplicity of the code from your original question. Here you would have to remove the runat="server" from the div tag and use css "display:none" instead of the "Visible" property. The downside to this approach is that the tag still gets sent to the browser even if it is not visible and the visibility is handled on the client side.

<div style='<%=MyVisiblePropertyOnCodeBehind ? "" : "display: none" %>' >
    Content
</div>

ReferenceURL : https://stackoverflow.com/questions/9595851/set-visible-property-with-server-tag-in-framework-3-5

반응형