2012-08-13 35 views
5

使用<%= %>或<%# %>與RUNAT =服務器我有一個Web控制,看起來像這樣在ASP.NET

 
public class Foo : WebControl 
{ 
    [Bindable(true)] 
    [Category("Default")] 
    [DefaultValue("")] 
    [Localizable(true)] 
    public string Bar { get; set; } 

    protected override void Render(HtmlTextWriter output) 
    { 
    output.WriteLine(Bar); 
    } 
} 

我想把這個三夏在我的aspx頁面像這樣:

 
<cc1:Foo Bar="<%= Fa.La.La %>/otherstuff" runat="server" /> 

(顯然這個代碼被簡化以顯示問題)

在我的Render方法中,變量Fa.La.La未被評估。這是作爲原始文本「<%= Fa.La.La%>」我如何評估它?

我不是特別的如何傳遞變量。如果變量可以被評估,如果他們被傳入<%#...%>,那很好。重點是我有一些服務器端變量,我想在之前/之前評估我的Render()方法被調用。

我唯一能想到的是使用正則表達式來獲取<%= ...%>的內容,並使用反射或其他東西,但必須有一種更優雅的方式來實現這一點。

這個問題與using server variables in a href <%= xx %> with runat=server非常相似,但它不完全相同,因爲沒有任何答案有用。

+0

嘗試使用此/otherstuff' RUNAT = 「服務器」/>注單引號和雙引號區別。我希望它可以解決問題 – Moons 2012-08-13 04:24:13

回答

2

您應該必須使用綁定表達式<%# expr %>

<cc1:Foo Bar='<%# String.Concat(Fa.La.La,"/otherstuff")%>' runat="server" /> 

並調用代碼隱藏DataBind()方法。

public void page_load() 
{ 
    DataBind(); 
} 
+1

要擴大這個答案,你不能做這樣的事情: 酒吧=「<%#Fa.La.La%>/otherstuff」 它只是從字面上得到渲染。 數據綁定表達式必須是該屬性中唯一的東西,例如, Bar ='<%#String.Concat(Fa.La.La,「/ otherstuff」)%>' 此外,外部引號應該是單個 - 引用和內部引號應該是雙引號(假設C#,無論如何)。 – mhenry1384 2012-08-13 05:52:19

5

那麼,首先你應該清楚地區分兩個標籤。 這裏有幾點我已閱讀並實際使用..

  • <%=表達式在渲染
  • <%#表達式在DataBind()時間評估,並沒有評估在所有如果 的DataBind()是時候進行評估不叫。
  • <%#表達式可以在服務器端控件中用作屬性 。 <%=表達式不能。

讀更多它MSDN Blog