c#
  • asp.net
  • 2010-12-12 132 views 0 likes 
    0

    MainPage.aspx數據綁定不工作

    <asp:HyperLink runat="server" NavigateUrl='<%#"http://google.pl"%>'>test</asp:HyperLink> 
    

    它不添加href標籤,但只輸出<a>test</a>。 當我這樣做:

    <asp:HyperLink runat="server" NavigateUrl='http://google.pl'>test</asp:HyperLink> 
    

    它工作正常。

    爲什麼<%#"http://google.pl"%>不起作用?

    如何調試?

    回答

    6

    不能將HTML文字輸出到asp控件屬性中。您可以在代碼隱藏中設置超鏈接NavigateUrl屬性,也可以將html錨點輸出爲文字。

    輸出的文字(在這種情況下,您的代碼隱藏類必須公開保護或公共財產或字段命名UrlParams)

    // site.aspx 
    <a href="<%="http://google.pl" + UrlParams.Google%>">test</a> 
    

    設置在隱藏代碼:

    // site.aspx 
    <asp:HyperLink runat="server" ID="link1">test</asp:HyperLink> 
    // site.aspx.cs or <script runat="server">..</script> 
    protected void Page_Load(..) { 
        link1.NavigateUrl = "http://google.pl" + UrlParams.Google; 
    } 
    

    並回答了你原來的問題。 <#data-binding expression,它在服務器控件屬性和數據源之間創建綁定。

    編輯:事實證明,你實際上也可以使用<#語法的字符串。它工作的關鍵是調用Control.DataBind()方法。您可以在HyperLink控件上甚至在當前頁面上調用它,因爲Page是從Control繼承的。

    例子:(把這個空aspx頁面 - 無需使用數據源):

    <asp:HyperLink ID="link1" runat="server" NavigateUrl='<%# "#Test" %>'>Test</asp:HyperLink> 
    <script runat="server" type="text/C#"> 
        protected override void OnLoad(EventArgs e) 
        { 
         DataBind(); 
         // or: 
         // link1.DataBind(); 
         base.OnLoad(e); 
        } 
    </script> 
    
    0

    這是黑暗中的刺,但<%#%>標籤指示您要運行數據綁定代碼(例如,您從數據庫返回的內容)。

    你不需要這些來輸出字符串文字,但如果你這樣做,適當的標籤將是<%=,而不是<%#

    +0

    當我使用'<%='時,它給出了以下輸出代碼:'">test' – hsz 2010-12-12 18:18:49

    +0

    我從來沒有試過在NavigateUrl屬性中使用該標記(我不是故意暗示應該使用該標記標籤,我會盡快編輯答案來澄清這一點),但同樣,您不需要使用ASP.NET標籤爲您的NavigateUrl屬性分配字符串文字。 – jwiscarson 2010-12-12 18:24:03

    +0

    是的,我知道,但我想從例如某個班級獲得該地址:UrlParams.Google。然後我想這樣做:'NavigateUrl ='<%=「http://google.pl」+ UrlParams.Google%>'「,但它不起作用。 – hsz 2010-12-12 18:31:16

    3

    對不起,但這確實可以工作:

    <asp:ListView ID="lvTest" runat="server"> 
    <ItemTemplate> 
        <asp:HyperLink ID="test" NavigateUrl='<%#"http://google.pl"%>' runat="server">test</asp:HyperLink> 
    </ItemTemplate> 
    

     
    
    protected void Page_Load(object sender, EventArgs e) 
    { 
        lvTest.DataSource = Enumerable.Range(0, 5); 
        lvTest.DataBind(); 
    } 
     
    

    ,如果你想要混合數據源和文字你可以這樣做:

    <asp:HyperLink ID="test" NavigateUrl='<%#"http://google.pl?page=" + Container.DataItem %>' runat="server">test</asp:HyperLink> 
    

    如果要訪問特定屬性,則應該使用Eval而不是Container.DataItem。順便說一句,這是不好的做法。您應該使用ItemDataBound(或類似事件)並使用強類型C#代碼進行綁定。

    +0

    它工作正常,但關鍵是DataBind()調用。您不需要使用DataSource進行控制。看到我更新的答案。 – m0sa 2010-12-12 20:26:32

    +0

    在沒有數據源的情況下調用DataBind是完全沒有意義的,除非在一些哈希的情況下解決ASP.NET的解決方法。 – Stilgar 2010-12-12 21:52:35

    +0

    那你爲什麼要打電話呢? – m0sa 2010-12-12 23:26:25

    3

    您可以使用像這樣:頁面

    HTML部分:

    <asp:HyperLink ID="test" NavigateUrl="<%# GetUrl() %>" runat="server">test</asp:HyperLink> 
    

    後面的代碼:

    protected string GetUrl() 
    { 
        //Put your logic here to generate dynamicly url that you want 
    } 
    
    protected void Page_Load(object sender, EventArgs e) 
    { 
        DataBind(); 
    } 
    

    希望它會幫助你。

    最好的問候,迪馬。

    相關問題