【问题标题】:ASP.NET Repeater and DataBinder.EvalASP.NET 中继器和 DataBinder.Eval
【发布时间】:2010-12-13 03:28:21
【问题描述】:

我的网页中有一个<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;
}

但是,当我运行该页面时,Text='&lt;%#DataBinder.Eval(Container.DataItem,"letter")' 中会抛出“指定的强制转换无效异常”。我不知道为什么,我尝试使用 (String) 手动转换为 String,我尝试了 ToString() 方法,我尝试了所有方法。

另外,如果在调试器中我为 DataBinder.Eval(Container.DataItem,"letter") 添加一个监视,它返回的值是“A”,据我说,这对于 Text 属性应该没问题。

编辑:

这是一个例外:

System.InvalidCastException 未被用户代码处理
Message="指定的演员表无效。"来源="App_Web_cmu9mtyc"
堆栈跟踪: 在 e:\Documents and Settings\Fernando\My 中的 ASP.savecondition_aspx.__DataBinding__control7(Object sender, EventArgs e) 文档\Visual Studio 2008\Projects\mediTrack\mediTrack\saveCondition.aspx:第 45 行 在 System.Web.UI.Control.OnDataBinding(EventArgs e) 在 System.Web.UI.Control.DataBind(布尔 raiseOnDataBinding) 在 System.Web.UI.Control.DataBind() 在 System.Web.UI.Control.DataBindChildren() InnerException:

任何建议将不胜感激,谢谢

编辑 2: 已修复!问题不在 Text 或 CSS 标签中,而是在 Enabled 标签中,我必须将其转换为布尔值。问题是在Text标签处发出了异常信号,我不知道为什么

【问题讨论】:

  • 您确定异常是在“字母”而不是“启用”部分吗?
  • 你说得对!就是这样,我从来没有尝试过从 enabled 属性中删除 Eval ......谢谢!
  • 我希望 MS 永远不要将绑定放入页面。如果您只能从代码隐藏中避免这些问题,那就更好了。

标签: c# .net asp.net data-binding repeater


【解决方案1】:

我不知道这是否会有所不同,但请尝试关注(也请注意间距)

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

【讨论】:

    【解决方案2】:

    从您给出的示例中,您不需要数据集,只需要数据表。此外,您没有指定列的数据类型。

    DataTable indexTable = new DataTable();
    indexTable.Columns.Add("letter", typeof(string));
    
    //do stuff
    
    _repeater.DataSource = indexTable;
    _repeater.DataBind();
    

    然后像这样评估

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

    【讨论】:

    • 不幸的是,如果我这样做(将数据类型添加到列中,并且仅使用数据表),它仍然会发生我编辑了帖子以留下异常跟踪
    【解决方案3】:

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

    <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】:

    看起来问题出在 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2011-11-29
      • 2011-03-26
      • 2011-11-07
      相关资源
      最近更新 更多