2012-03-07 9 views
51

Ho lavorato in un progetto .NET Framework 4 utilizzando tag del server come <% = qualunque sia%> per impostare la visibilità dei controlli runat = "server", come segue:Imposta la proprietà Visible con il tag del server <%= %> in Framework 3.5

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

Questo funziona con il framework 4, ma ora si sta tentando di utilizzarlo su un progetto Framework 3.5 che sembra non funzionare. Questa è solo una caratteristica di Framework 4? Esiste un'alternativa più interessante (e con estensione .xx) per impostare la visibilità da codebehind? Sto usando il brutto:

MiId.Visible = MyVisiblePropertyOnCodeBehind 

Grazie in anticipo,

Tom

[Modificato] SOLUZIONE:

Grazie per i vostri commenti che mi fa capire il mio problema e la soluzione!

È stata colpa mia in più di una cosa.

Nel progetto VS2010 usavamo <% # invece di <% =

Inoltre, non ho notato che nel progetto VS2010 stavamo usando pagine non ereditate da “pagina”, ma da un CustomPage classe, che stava facendo automaticamente il binding, senza che me ne accorgessi, e questo mi fa pensare che fosse solo una funzionalità di Framework 4.0.

Come detto qui, se avete la seguente marcatura:

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

si può farlo funzionare, aggiungendo quanto segue al codebehind:

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

Come ho letto, questo DataBind () può ridurre le prestazioni dell'applicazione. Hai idea di quanto? Potrebbe essere intesa come una tecnica "professionale" da utilizzare su grandi progetti, o pensi che dovrebbe essere evitato?

Mi piace il modo in cui rende il markup leggibile e facile da capire in un'unica visualizzazione, ma non mi piacerebbe essere colpevole di codice lento perché quello.

+0

Qual è la firma della proprietà 'MyVisiblePropertyOnCodeBehind'? – PraveenVenu

+0

In realtà non penso che sia brutto impostarlo nel codice. Imposta 'visible =" false "' come predefinito nella parte frontale del codice se vuoi ricordare che il controllo non è necessariamente visibile. – mac9416

risposta

69

Il codice che hai postato non è sintassi valida per i tag server nel runtime di ASP.NET 2.0 o ASP.NET 4.0. In entrambe le versioni, cercando di impostare la proprietà visibile utilizzando <%= ... %> in un tag server dovrebbe tradursi in un errore del parser:

Parser Error Message: Cannot create an object of type 'System.Boolean' from its string representation '<%=MyVisiblePropertyOnCodeBehind%>' for the 'Visible' property.

Hai due opzioni diverse da solo impostando la proprietà Visible nel codebehind o un tag <script runat="server">. Il primo consiste nell'utilizzare un'associazione dati sulla proprietà Visible. Dovrai chiamare il metodo DataBind() su MyId o uno dei relativi controlli padre per il valore da associare.

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

L'altra opzione è quella di scrivere il codice come segue:

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

Lo svantaggio di questo approccio è che non sarà in grado di aggiungere a livello di codice controlli alla pagina o di controllo che contiene il blocchi di codice. Se si tenta di si dovrebbe ottenere un errore:

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>)

Detto questo, penso che solo l'impostazione della proprietà il modo in cui si sta facendo ora è la strada da percorrere.

+0

Ho finalmente capito il mio problema grazie a questo, e ai collegamenti nel messaggio "arunes". Grazie. (mi dispiace ma sono nuovo e non posso votare). – tomasofen

+0

Cool, felice di poterti aiutare! – rsbarro

+1

@rsbarro Ho trovato un'altra stranezza usando un blocco '<% if', in modo tale che gli errori di validazione vengano lanciati sul postback. Se il blocco contiene un RequiredFieldValidator che non dovrebbe essere reso, il postback continuerà a usarlo come se esistesse e causasse un errore di convalida. Ho scoperto che dovevo ancora usare un'espressione booleana per impostare 'Enabled = '<%# false %>'' e chiamare 'someControlId.DataBind();' nel codice dietro Page_Load per ottenere la disabilitazione del validatore sul postback. – AaronLS

3

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

articolo completo qui: http://www.aspnet-answers.com/microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

Ed soluzione qui: ASP.net Inline Expression Issue

3

Basta impostare una variabile su false true/sul vostro evento Pageload come questo

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

Poi nelle proprietà di controllo all'interno pagina aspx, impostare la loro visibilità attraverso una proprietà come

Visible="<%# !IsEditMode %>" 
+0

Siamo spiacenti, ma questa cosa non è correlata alla domanda e il codice è confuso, con nomi di proprietà diversi :( – tomasofen

+0

@tomasofen Ho aggiornato la mia risposta con una denominazione appropriata. –

1

Ecco un altro approccio che mantiene la semplicità del codice dalla tua domanda originale. Qui dovresti rimuovere runat = "server" dal tag div e usare css "display: none" invece della proprietà "Visible". Lo svantaggio di questo approccio è che il tag viene comunque inviato al browser anche se non è visibile e la visibilità viene gestita dal lato client.

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