c#
  • asp.net
  • 2010-12-12 86 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(); 
    } 
    

    希望它会帮助你。

    最好的问候,迪马。

    相关问题