ASP.NET内联表达式无法在CssClass属性中工作?

时间:2013-01-30 18:00:14

标签: asp.net vb.net webforms web-controls

我有以下代码:

<asp:LinkButton runat="server" 
                CommandName="SwitchStep"
                CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ID")%>'
                CssClass="<%# some conditional code here %> activestep">
    Step <%# Container.ItemIndex + 1 %>: <%# DataBinder.Eval(Container.DataItem, "ID")%>
</asp:LinkButton>

内联语句适用于CommandArgument属性,我知道它们在text属性中有效。但是,出于某种原因,在CssClass属性中,内联语句在HTML输出中结束(未解析)!怎么了?

在Chrome中:

<a class="&lt;%= 'steptab' %&gt;" href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("StepControl:_ctl1:_ctl0", "", true, "", "", false, true))'>
            Step 1: section_name</a>

有没有人遇到过这个?我不确定为什么这不起作用。这似乎不符合逻辑,我有点沮丧。

一些注意事项:

  • 如果我在这里放置一个不属于的角色,例如“?” (这是VB),编译器抱怨。
  • 任何服务器标记(&lt;%,&lt;%#等)都会显示在HTML中。
  • 这是在转发器控件内。等等,这就在代码中。
  • 如果我在内联语句后删除了“activestep”类,则内联语句仍然会出现,尽管有时候我根本没有出现在HTML中的类属性。

有什么想法吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用String.Format()

构建CssClass
CssClass='<%# String.Format("{0} activestep", If(condition, "truestring", "falsestring"))%>'>

答案 1 :(得分:0)

我不确定您是否可以在CssClass属性中编写表达式。试试这个:

<asp:LinkButton runat="server" 
                CommandName="SwitchStep"
                CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ID")%>'
                CssClass="<%$ Iif(condition, "activestep", "") %>">
    Step <%# Container.ItemIndex + 1 %>: <%# DataBinder.Eval(Container.DataItem, "ID")%>
</asp:LinkButton>

另一方面,您可以使用ItemDataBound事件处理程序来包装您的条件,并在Repeater中的控件上设置CssClass属性。看看

在WEbForm中,添加对ItemDataBound的引用

<asp:Repeater id="Repeater1" OnItemDataBound="Repeater1_ItemDataBound" runat="server">
...
</asp:Repeater>

VB.NET

' This event is raised for the header, the footer, separators, and items.
Public Sub Repeater1_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) 

    ' Execute the following logic for Items and Alternating Items.
    if e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then

        Dim p as Product = CType(e.Item.DataItem, Product) ' cast to your entity just a sample

        If p.Active Then ' check some condition     

            CType(e.Item.FindControl("Your_LinkButtonId"), LinkButton).CssClass = "activestep"

        End If
    End if

End Sub

C#

// This event is raised for the header, the footer, separators, and items.
public void Repeater1_ItemDataBound(Object sender, RepeaterItemEventArgs e) 
{
    // Execute the following logic for Items and Alternating Items.
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {
        Product p = (Product)e.Item.DataItem; // cast to your entity just a sample

        if (p.Active) // check some condition
        {
            ((LinkButton)e.Item.FindControl("Your_LinkButtonId")).CssClass = "activestep";
        }
    }  
}