数据绑定不起作用

时间:2010-12-12 18:11:49

标签: c# asp.net

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"%>不起作用?

如何调试?

4 个答案:

答案 0 :(得分:6)

您无法将HTML文字输出到asp控件属性中。您可以在codebehind中设置超链接NavigateUrl属性,也可以将html锚点输出为文字。

输出为文字(在这种情况下,您的代码隐藏类必须公开名为UrlParams的受保护或公共属性或字段)

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

在codebehind中设置:

// 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>

答案 1 :(得分: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。 BTW这一切都是不好的做法。您应该使用ItemDataBound(或类似事件)并使用强类型C#代码进行绑定。

答案 2 :(得分: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();
}

希望它会对你有所帮助。

最好的问候,迪马。

答案 3 :(得分:0)

这是一个黑暗中的刺,但<%#%>标记表示您想要运行数据绑定代码(例如,您从数据库返回的内容)。

您不需要这些输出字符串文字,但如果您这样做,相应的标记将是<%=,而不是<%#