Asp.net “System.String”不包含属性

Asp.net “System.String”不包含属性,asp.net,linq,Asp.net,Linq,从数据库中提取数据时出现问题。要显示产品的名称和图像。提取记录时引发“System.String”不包含属性错误 提前谢谢。您正在将中继器数据绑定到我所能看到的字符串列表中 此行将获取字符串列表: <asp:Repeater ID="rptProducts1" runat="server"> <ItemTemplate> <div class="product_header"> <a

从数据库中提取数据时出现问题。要显示产品的名称和图像。提取记录时引发“System.String”不包含属性错误


提前谢谢。

您正在将中继器数据绑定到我所能看到的字符串列表中

此行将获取字符串列表:

<asp:Repeater ID="rptProducts1" runat="server">
        <ItemTemplate>
            <div class="product_header">
                <asp:Label ID="prodLabels" runat="server" >
                    <p><h4><%#Eval("Name") %></h4></p>
                </asp:Label>
    </div>

    <div class="left-col">
    <div class="img_product">

       <asp:Image ID="imgProduct" runat="server"  ImageUrl='<%# Eval("Picture") %>' Width="200px" Height="200px"/>

    </div>
        </div>

        </ItemTemplate>
        </asp:Repeater>

Code Behind:

 List<ProductModel> _prodObj = new List<ProductModel>();


                    _prodObj = response.Content.ReadAsAsync<List<ProductModel>>().Result;

                    _prodObj.Where(x => x.PictureId != 0).Select(v => v.Picture = "data:image/png;base64," + Convert.ToBase64String(v.PictureBinary));
                    var _prodname = _prodObj.Where(x=>x.Id!=0).Select(i => i.Name=""+i.Name);
                    try
                    {
                        rptProducts1.DataSource = _prodname;
                        rptProducts1.DataBind();
                    }
                    catch (Exception ex)
                    {

                        throw;
                   }
=>\u prodname将等于一个名称列表

然后,当您进行数据绑定时,您有以下行:

var _prodname = _prodObj.Where(x=>x.Id!=0).Select(i => i.Name=""+i.Name);
这实际上是说:获取当前对象,它是一个字符串,并在这里打印Id属性。但因为它是一个字符串,所以它没有ID属性,因此出现了异常

简而言之:绑定到要显示完整对象的产品列表,而不仅仅是名称,或者更改视图以不使用任何根本不存在的属性

更新 如果您只想显示一个产品,我建议您在对控件进行数据绑定之前选择正确的产品服务器端,例如:

Eval("Id")
。。。其中myId当然就是您要搜索的Id

然后,您应该使用中继器来显示数据。您可以使用如下标签:

var _prodname = _prodObj.Where(x=>x.Id!=0 && x.Id == myId).FirstOrDefault().Select(i => i.Name=""+i.Name); 
我怀疑这是失败的,因为x是一个字符串,而不是您所期望的

您需要进行一些调试以确定x是什么类型,然后回溯以找到它不再是您期望的类型的位置

而且


LINQ是惰性计算的,除非有东西枚举了上述表达式的结果,否则不会执行任何操作。

谢谢,先生,但是如何根据单个产品的id显示名称,所以您只想显示一个产品?那么,中继器就不是实现这一点的方法,因为该控件用于项目列表。我只需要在那里放置一个asp:label,然后更改它的Text属性来设置名称。我用一个例子更新了我的答案。这有帮助吗?我认为最后一部分有点误导。问题不在于延迟求值,而在于它不修改_prodObj,而是返回一个新的IEnumerable,然后将其丢弃。我相信OP可能希望用where和select来修改_prodObj。谢谢,先生,但不知道如何根据单个的id显示名称product@MaheshGulve请参阅Steven Lemmons对自己答案的评论,除此之外,我们可能还需要更多地了解您的代码。
<asp:Label ID="myLabel" runat="server" />

// and server side you would do this:
myLabel.Text = _prodName;
prodObj.Where(x=>x.Id!=0)
_prodObj.Where(x => x.PictureId != 0).Select(v => v.Picture = "data:image/png;base64," + Convert.ToBase64String(v.PictureBinary));