将ListView绑定到接口列表而不是类

时间:2017-03-22 21:35:56

标签: asp.net listview data-binding interface

好的,这有点复杂,所以让我解释一下。

我在现有项目中有几个具有不同联系信息的类。例如,CompanyContact可能包含

 1. CompanyName
 2. Phone
 3. Fax

ProviderContact可能有

1. ProviderName
2. FirstName, 
3. LastName, 
4. Phone, 
5. Fax

和ProviderLocation可能有

1. Name (location name)
2. Phone1
3. Fax1

每个类都有其他属性,这只是一个子集。有些字段意思相同,但命名不同。 CompanyName,ProviderName和Name(在ProviderLocation中)都意味着相同的东西,就像Phone和Phone1是相同的(至少对我来说)。

我创建了一个接口IFaxContact,试图为所有这些类提供一个通用接口,因为我需要在不同情况下从它们那里获取联系信息,以便自动化传真和电子邮件。

public interface IFaxContact
{
    string EntityName { get; set;}
    string FullName {get; set;}
    string Email { get; set;}
    string Fax { get; set;}
    string Phone { get; set;}
}

我在所有相关类中明确地实现了这一点,但是如果该属性已经存在,我没有再添加它,因为现有属性将用于所有实现。

我目前有一个工厂类,它正在创建单个类并返回IFaxContact或List<IFaxContact>的对象。这在大多数情况下运作良好。

现在,我有一个ListView控件,我将List<IFaxContact>绑定为数据源。当它进行绑定时,它将对象称为基类(即CompanyContact)而不是接口IFaxContact,并且由于该字段不存在而给出错误。我试图将它绑定到IFaxContact的绑定表达式,但它没有接受它。

<asp:ListView ID="lvRecipients" runat="server" OnItemCommand="lvRecipients_ItemCommand">
    <LayoutTemplate>
        <ul style="list-style: none;">
            <li runat="server" id="itemPlaceholder"></li>
        </ul>
    </LayoutTemplate>
    <ItemTemplate>
        <li>**<span style="width: 100px; margin-right: 2px;"><%# Eval("FullName") %></span>
            <span style="width: 100px; margin-right: 2px;"><%# DataBinder.Eval((Entities.IFaxContact)Container.DataItem, "EntityName")%></span>
            <span style="width: 50px; margin-right: 2px;"><%# Eval("Fax") %></span>
            <span style="width: 50px;">**
             <a href="#" runat="server" onclick="lnkAddOtherRecipient_Click">
               <i class="fa faGreen fa-plus fa-lg "></i>
             </a>
            </span>
        </li>
    </ItemTemplate>
</asp:ListView>

绑定正在上面的ItemTemplate中完成。

我得到的错误是:     System.Web.HttpException(0x80004005):DataBinding:'Entities.CompanyContact'不包含名为'EntityName'的属性。

这是因为EntityName存在于IFaxContact下,而不存在于类(即CompanyContact)中,但DataItem的类型为CompanyContact(或其他类之一)。

我需要一些帮助来弄清楚如何正确地将Eval(...)表达式中的Container.DataItem强制转换为IFaxContact,或者另外一个解决方案将与我目前设计的界面一起使用。

由于

0 个答案:

没有答案