在listview中,ASP.NET Server标记没有格式错误

时间:2011-03-10 19:55:52

标签: javascript asp.net listview client-server

“关注图片”按钮就像魅力一样

             <asp:ListView ID="ListView1" runat="server">
                <layouttemplate>
                    <asp:PlaceHolder id="itemPlaceholder" runat="server" />
                </layouttemplate>
                <ItemTemplate> 
                  <asp:ImageButton onmouseover="javascript:show('Error1');"  ID="btnContainsError" runat="server"/> 
                </ItemTemplate>
            </asp:ListView>

但现在我想为列表视图中的每条记录“使其工作”

因此,对于记录1,它应该像

    <asp:ImageButton onmouseover="javascript:show('Error1');" 
    ID="btnContainsError" runat="server"/>

为第二条记录

<asp:ImageButton onmouseover="javascript:show('Error2');" 
 ID="btnContainsError" runat="server"/>

依旧......

不幸的是,我做的一些尝试(如下所示)会产生Server tag is not well formed错误

<asp:ImageButton onmouseover="javascript:show('<%# "Error" & DataBinder.Eval(Container.DataItem, "Counter") %>');" ID="btnContainsError" runat="server"/>

那么请你指点一下,正确的方法吗?

4 个答案:

答案 0 :(得分:1)

如果在属性中使用服务器端代码标记(<% %>),则需要将属性值包装在单引号中而不是双引号中。

尝试将onmouseover属性更改为:

onmouseover='javascript:show("<%# "Error" + DataBinder.Eval(Container.DataItem, "Counter") %>");' 

或者,您可以在后面的代码中创建一个方法并将其命名为

onmouseover='javascript:show("<%# GetErrorText(Container.DataItem) %>");

在您的代码中:

protected string GetErrorText(object dataItem)
{
    return "Error" + (dataItem as MyObject).Counter;
}

答案 1 :(得分:1)

问题是你不能把这个串联放在&lt;%#%&gt;之内控件中的标签。在这种情况下我通常做的是在表单对象上创建一个公共属性,然后从控件中调用该属性。例如,将它放在后面代码的表单对象上:

Public Function GetError(ByVal sVal As String) As String
    Return "Error " & sVal
End Function

然后你可以在你的aspx页面中添加以下内容:

<asp:ImageButton onmouseover="javascript:show('<%# GetError(DataBinder.Eval(Container.DataItem, "Counter")) %>');" ID="btnContainsError" runat="server"/>

这应该有用。

答案 2 :(得分:1)

以这种方式试试

<asp:ImageButton onmouseover='show(this.errorMessage);' errorMessage='<%# "Error" & DataBinder.Eval(Container.DataItem, "Counter") %>' ID="btnContainsError" runat="server"/>

答案 3 :(得分:0)

我认为您不能在任何服务器端控件中使用任何类型的<%服务器端标记 - 即任何runat="server"

这是未经测试的,已经有一段时间了,因为我已经完成了任何经典的ASP.NET ......但是这里有了!

<asp:ListView ID="ListView1" runat="server" OnItemDataBound="ListView_OnItemDataBound">
    <layouttemplate>
        <asp:PlaceHolder id="itemPlaceholder" runat="server" />
    </layouttemplate>
    <ItemTemplate> 
        <asp:ImageButton ID="btnContainsError" runat="server"/> 
    </ItemTemplate>
</asp:ListView>

请注意OnItemDataBound属性。

现在在你的代码中:

protected void ListView_OnItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem) //You might want to change this
    {
        //this will be what ever you are binding... so the T in IEnumerable<T> that is the ListView.DataSource
        var someClassItem = e.Item.DataItem as SomeClass;

        if (string.IsNullOrWhiteSpace(someClassItem.Counter))
        {
            ImageButton btnContainsError = e.Item.FindControl("btnContainsError") as ImageButton;
            btnContainsError.Attributes["onmouseover"] = "javascript:show('Error" + someClassItem.Counter + "')";
        }
    }
}