Why doesn't binding expression work with C# ex

2019-03-22 16:42发布

问题:

The following code compiles, but doesn't work. As far as I know data-binding expressions allow any valid C# code in them. So what am I doing wrong here?

<asp:Panel CssClass='<%# ("my-class") %>' runat="server" ID="myPannel">
   Blah
</asp:Panel>

<% this.myPannel.DataBind(); %>

I am not getting any errors. It just doesn't render the class attribute whatsoever. I tried without the parenthesis with the same bad luck.

Please note, I need an expression to be evaluated in CssClass attribute and I am expecting the result of that expression to be assigned to the class attribute. This is why I emphasized this by enclosing the string into parenthesis.

回答1:

Try this:

<html>
<head runat="server">
    <title></title>
    <script runat="server">
        protected void 
            Page_Load(object sender, EventArgs e)
        {
            this.myPannel.DataBind();
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Panel CssClass='<%# ("my-class") %>' 
            runat="server" 
            ID="myPannel">
            Blah
        </asp:Panel>
    </form>
</body>
</html>

Or just switch the order of your inline code snippets:

<body>
    <% this.myPannel.DataBind(); %>
    <form id="form1" runat="server">
        <asp:Panel CssClass='<%# ("my-class") %>'
            runat="server"
            ID="myPannel">
            Blah
        </asp:Panel>
    </form>
</body>

Or simply use:

<% this.myPannel.CssClass = "my-class";%>
<form id="form1" runat="server">
    <asp:Panel
        runat="server"
        ID="myPannel">
        Blah
    </asp:Panel>
</form>

In all three cases, you have to make sure that the control property is updated before the actual inline code of the control is being processed in the page's life cycle.