我正在尝试从数据库中填充一个简单的ASP转发器。查询工作正常,并返回几个varchar类型的字符。这是我的代码,任何见解都会有很多帮助,我很难过。
前端
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<p> <%# Eval("FormData")%> </p>
</ItemTemplate>
</asp:Repeater>
后端
public void Page_Load(object sender, EventArgs e)
{
Repeater1.DataSource = GetKudosList();
Repeater1.DataBind();
}
public List<string> GetKudosList()
{
using (IntranetEntities KudosContext = new IntranetEntities())
{
var jon = KudosContext.FormInstances.Where(u => u.WorkflowID == 1).Select(u => u.FormData).ToList();
return jon;
}
}
即使我只是在后端创建一个列表对象而没有触及数据库,我仍然会得到以下错误 'System.String'不包含名称为'FormData'
的属性答案 0 :(得分:2)
您的问题出在您的linq声明中 - &gt;您正在选择:.Select(u =&gt; u.FormData).ToList();
你将得到一个FormData类型的列表,它可能是String的类型...(导致eval失败。你试图在一个简单的字符串上eval属性“FormData”)
使用不带eval的项目,或删除选择:
选项1: 您只需要来自对象的FormData: 按原样使用linq,更改转发器模板:
<p> <%# Container.DataItem %> </p>
选项2: 你需要整个对象,并且想要显示它的属性, 改变你的linq:
var jon = KudosContext.FormInstances.Where(u => u.WorkflowID == 1).ToList();
答案 1 :(得分:0)
更改linq查询以选择匿名类型而不是字符串。
var jon = KudosContext.FormInstances
.Where(u => u.WorkflowID == 1)
.Select(u => new { FormData = u.FormData}).ToList();
现在,您可以使用DataBinder
从匿名类型获取属性名称:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<p> <%# (string)DataBinder.Eval(e.Item.DataItem, "FormData"); %> </p>
</ItemTemplate>
</asp:Repeater>
答案 2 :(得分:0)
感谢所有支持!我认为你的建议是正确的,但他们不适合我。字符串&#34; FormData&#34;没有绑定到对象
<%# this.GetDataItem().ToString() %>