ASP.NET Repeater 和 DataBinder.Eval

6

我在网页中有一个<asp:Repeater>,它绑定了一个程序创建的数据集。

这个重复器的目的是创建一个从A到Z的索引,当点击时,刷新页面上的信息。

重复器有一个链接按钮,如下所示:

<asp:LinkButton ID="indexLetter" Text='<%#DataBinder.Eval(Container.DataItem,"letter")%>'
runat="server"   CssClass='<%#DataBinder.Eval(Container.DataItem, "cssclass")%>'
Enabled='<%#DataBinder.Eval(Container.DataItem,"enabled")%>'></asp:LinkButton>

数据集是以下方式创建的:

protected DataSet getIndex(String index)
    {
        DataSet ds = new DataSet();
        ds.Tables.Add("index");
        ds.Tables["index"].Columns.Add("letter");
        ds.Tables["index"].Columns.Add("cssclass");            
        ds.Tables["index"].Columns.Add("enabled");
        char alphaStart = Char.Parse("A");
        char alphaEnd = Char.Parse("Z");
        for (char i = alphaStart; i <= alphaEnd; i++)
        {
            String cssclass="", enabled="true";
            if (index == i.ToString())
            {
                cssclass = "selected";
                enabled = "false";
            }
            ds.Tables["index"].Rows.Add(new Object[3] {i.ToString(),cssclass,enabled });
        }
        return ds;
}

然而,当我运行页面时,在中抛出了一个“指定的转换无效异常”。我不知道为什么,我尝试使用(String)手动进行强制转换为字符串,我尝试了ToString()方法,我尝试了所有方法。
另外,如果在调试器中添加一个DataBinder.Eval(Container.DataItem,“letter”)的监视器,它返回的值是“A”,根据我的理解,应该对Text属性没有问题。
编辑:
以下是异常:
System.InvalidCastException was unhandled by user code Message="Specified cast is not valid." Source="App_Web_cmu9mtyc" StackTrace: at ASP.savecondition_aspx.__DataBinding__control7(Object sender, EventArgs e) in e:\Documents and Settings\Fernando\My Documents\Visual Studio 2008\Projects\mediTrack\mediTrack\saveCondition.aspx:line 45 at System.Web.UI.Control.OnDataBinding(EventArgs e) at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.Control.DataBind() at System.Web.UI.Control.DataBindChildren() InnerException:
任何建议将不胜感激,谢谢。
编辑2: 已修复!问题不在Text或CSS标签中,而在Enabled标签中,我必须将其转换为布尔值。问题是异常在Text标签处被信号化,我不知道为什么

你确定异常出现在“letter”而不是“enabled”部分吗? - Marek Karbarz
你是对的,Zarembisty!就是那样,我从来没有尝试过仅从启用属性中删除 Eval…谢谢! - Fernando
我希望微软从未将绑定放入页面中。如果只能从代码后台进行绑定以避免这些问题,那将会更好。 - Phill
4个回答

1
从你给出的例子来看,你不需要数据集,只需要数据表。此外,你没有指定列的数据类型。
DataTable indexTable = new DataTable();
indexTable.Columns.Add("letter", typeof(string));

//do stuff

_repeater.DataSource = indexTable;
_repeater.DataBind();

并且像这样进行评估

Text='<%# Eval("letter")%>'

不幸的是,如果我按照这种方式操作(将数据类型添加到列中,并仅使用dataTable),仍然会发生错误。我编辑了帖子以留下异常跟踪。 - Fernando

0

看起来问题出在Enabled值上 - 它需要是布尔类型。

这个可以正常工作:

        <asp:LinkButton ID="indexLetter" Text='<%# this.FooData()%>'
        runat="server"   CssClass='<%#DataBinder.Eval(Container.DataItem, "cssclass")%>'
        Enabled='<%#Convert.ToBoolean(DataBinder.Eval(Container.DataItem,"enabled"))%>'></asp:LinkButton>

0

我不知道这是否会有任何影响,但请尝试以下操作(注意空格)

<asp:LinkButton ID="indexLetter" Text='<%# Eval("letter")%>'
runat="server"   CssClass='<%# Eval("cssclass")%>'
Enabled='<%# Eval("enabled")%>'></asp:LinkButton>

-2

不想破坏练习,但硬编码有什么问题:

<a href="Page.aspx?LIndex=A">A</a>
<a href="Page.aspx?LIndex=B">B</a>
<a href="Page.aspx?LIndex=C">C</a>
...
<a href="Page.aspx?LIndex=Z">Z</a>

4
不!太可怕了。然而,一个简单的<% for(...) { %> 循环将使这个过程更简单。 - James

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