如何在ASP.NET页面的<% ... %>标记中使用C#代码?

11

我正在编写一个asp.net用户控件。它有一个属性——FurtherReadingPage,和两个与之绑定的控件:ObjectDataSource 和 Repeater。在Repeater中,我想要显示一个超链接,其href属性被设置为类似于FurtherReadingPage + "?id=" + Eval("Id")的东西。我不知道如何在页面标记中实现它。我可以单独使用 <% Eval("Id") %><% Response.Write(FurtherReadingPage + "?id=") %>,但我不知道如何将它们混合使用。

4个回答

25

您有几个不同的标签:

<%执行其中的代码:

<% int id = int.Parse(Request["id"]); %> 

<%= 将代码输出:

<%=id %> <!-- note no ; -->

<!-- this is shorthand for: -->
<% Response.Write(id); %> 

这两个标志会在页面渲染时打破正常流程,例如如果您在普通的Asp.net <head runat="server">中使用它们,将会导致问题。

<%# 数据绑定:

<%# Eval("id") %>

这使您能够指定控件的绑定,这些控件由Asp.net WebForms渲染为集合(而不是您可以使用<% =与字面控件一起使用的控件),例如:

<!-- this could be inside a repeater or another control -->
<asp:Hyperlink runat="server" ID="demo" 
     NavigateUrl="page.aspx?id=<%# Eval("id") %>" />

<%  //without this bind the <%# will be ignored
    void Page_Load( object sender, EventArgs e ) {
        demo.DataBind(); 
        //or
        repeaterWithManyLinks.DataBind(); 
    } 
%>

对于您的特定情况,您可以选择以下两种方法之一:

  • 使用 repeater 并结合 <%# Eval(...) %>repeater.DataBind();

或者

  • 使用 foreach 循环 (<% foreach(... %>) 并结合 <%= ... %>

3

试试这个:

<%#String.Format("{0}?id={1}",FurtherReadingPage, Id)%>

3

您可以像这样进行操作 -

<asp:Hyperlink runat="Server" ID="hlLink" NavigateUrl='<%# FurtherReadingPage + "?Id=" + DataBinder.Eval(Container.DataItem, "Id")  %>' />

1
尝试这个(示例作为链接):<a href='<%=FurtherReadingPage %>?id=<%# Eval("Id") %>'>我的链接</a>

这个混合使用了 <%= 和 <%#,在大多数情况下会导致问题。 <%= 在 Repeater 中不起作用,而 <%# 除非调用 DataBind(),否则也不起作用。 - Keith
@Keith:您错了。我刚刚尝试在重复器中使用<%=“Test”%>进行双重检查,它可以正常工作。 <%#仅适用于Databind()的情况。 - Sergio
抱歉,是的,<%= 可以在重复器中工作,取决于上面的控件层次结构不包含任何集合样式控件。基本上 <%= FurtherReadingPage %> 有时会在重复器中工作,而 <%# FurtherReadingPage %> 则总是可以。 - Keith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接