ASP.NET ObjectDataSource自动绑定到中继器-可能吗?

时间:2020-03-05 18:50:13  来源:igfitidea点击:

我有一个问题类:

class Question {
    public int QuestionNumber { get; set; }
    public string Question { get; set; }
    public string Answer { get; set; }
}

现在,我通过ObjectDataSource使它们的ICollection可用,并使用绑定到DataSource的Repeater来显示它们。我使用<%#Eval(" Question")%>显示问题,并使用TextBox和<%#Bind(" Answer")%>接受答案。

如果我的ObjectDataSource返回三个问题对象,那么我的中继器将在三个问题之后显示一个文本框,并在每个问题之后为用户提供答案。

到目前为止,效果很好。

现在,我想获取用户的响应,并将其放回相关的Question类中,然后将其保存下来。

当然,框架应该为我解决所有这些问题吗?我使用了Bind方法,指定了DataSourceID,在ObjectDataSource类中指定了Update方法,但是似乎没有办法真正启动整个过程。

我尝试在命令MyDataSource.Update()后面的代码中添加一个Command按钮,但是它尝试不带参数而不是期望的Question参数来调用我的Update方法。

当然,有一种简单的方法可以在几乎没有代码隐藏的情况下实现所有这些目标?

似乎所有的位都在那里,但是缺少一些胶水将它们粘在一起。

帮助!

安东尼

解决方案

回答

我们必须处理回发事件(单击按钮或者执行其他操作),然后枚举转发器项目,如下所示:

foreach(RepeaterItem item in rptQuestions.Items)
{
   //pull out question
   var question = (Question)item.DataItem;
   question.Answer = ((TextBox)item.FindControl("txtAnswer")).Text;

   question.Save() ?  <--- not sure what you want to do with it
}

回答

那么,如果我必须在回发时手动绑定所有备份,则Bind方法(与Eval方法相对)有什么意义呢?

回答

bind方法实际上不是针对中继器的,而是针对formview或者gridview的,在这里我们只编辑列表中的一个项目,而不是列表中的每个项目。

在两者上,单击一个编辑按钮,这将为我们提供绑定控件(使用bind绑定),然后单击保存链接,该链接会将项目自动保存回数据源,而无需任何代码。

回答

Ben:尝试过后,item.DataItem始终为null,根据以下文章,它并非旨在用于这种方式:

http://www.netnewsgroups.net/group/microsoft.public.dotnet.framework.aspnet/topic4049.aspx

那么,我该如何手动将其绑定回去呢?