DataBinding:Eval()与Container.DataItem强制转换 - 最佳实践

时间:2014-01-21 15:56:25

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

我需要在3-4个文件中将15-20个字段绑定到Repeater(因此,数据绑定字段的总数必须大约为60)。我阅读了一些技术文章如何做到这一点,理解这两种方法的优缺点。

Eval()简单而优雅,但使用反射,因此速度很慢。好吧,我不关心表现。 0.1s或0.2s加载页面 - 谁在乎。代码的可维护性和简单性是我的目标。我看到Eval()的主要缺点 - 它不是强类型的。而且,它接受字段名称作为字符串(?!!)。所以,如果我有一天重构我的代码并重命名底层对象的字段 - 我的代码将被静默打破并在运行时开始崩溃。我是对的吗?

((TYPE)Container.DataItem).Field看起来很丑陋(尤其是重复多次)。但它是强类型的并且排除了可能的错误。正确?

我对专业人士在企业应用程序中使用的方法感兴趣。

2 个答案:

答案 0 :(得分:3)

我建议使用强类型控件,例如ListView:http://weblogs.asp.net/dwahlin/archive/2013/03/26/asp-net-4-5-web-forms-features-strongly-typed-data-controls.aspx

在.NET 4.5中,这些控件已经过优化,可以为您提供两全其美的优势。

答案 1 :(得分:2)

很抱歉很长的回复!

我不确定我是否完全按照3-4文件关注你,但这是我们倾向于做的事情。另外,我首先要说99.9%的时间我们使用转发器是因为您具有数据布局和格式的灵活性。是的,还有其他控件可以通过一些更内置的功能使基本数据绑定更容易,但大多数情况下您不需要全部开销。

我们通常会创建一个绑定到转发器的类。因此,如果您需要组合多个数据源,则可以使用不同的预定义输入实例化该类。此时,您需要做的就是为要绑定到转发器的每个字段创建属性。使用这些属性,您可以根据需要格式化数据。例如,将名字和姓氏组合成一个fullname属性。因此,如果您需要重构代码,因为有人希望您更改名称格式,您只需更改格式类,您的转发器就不必更改。

<asp:Repeater ID="rptCalls" runat="server">

<ItemTemplate>      

            <tr runat="server" class='<%# Eval("RowClass") %>'>
                <td style="width: 40px;"><asp:Button ID="btnUpdate" runat="server" Text="View" CommandArgument='<%# Eval("Id") %>' CssClass="button" OnCommand="btnUpdate_Command" /></td>                  
                <td runat="server"><%# Eval("CallCount")%></td>
                <td style="width: 40px; white-space: nowrap; text-align: center;"><asp:Literal runat="server" Text='<%# Eval("TimeCalled") %>'></asp:Literal></td>                  
                <td><asp:Literal runat="server" Text='<%# Eval("Notified") %>'></asp:Literal></td>
                <td><asp:Literal runat="server" Text='<%# Eval("PatientName") %>'></asp:Literal></td>
                <td><asp:Literal runat="server" Text='<%# Eval("RequestorData") %>'></asp:Literal></td>
            </tr>
            </ItemTemplate>
        </asp:Repeater>

以下是该类中某些字段的示例。

public int Id         {             get {return notification.CallRequest.Id; }         }

    public string RowClass
    {
        get
        {
            return overduePolicy.IsOverdue() ? "overdue" : "";
        }
    }

    public string SearchCssClass
    {
        get
        {
            return notification.CallRequest.IsVoided ? "voided" : "";
        }
    }

rowclass属性是您可以对属性执行的操作的示例。如果您注意到开始TR标记,则它的Eval语句是Eval(“RowClass”),但它被分配给TR上的css“class”标记。实际类中的RowClass属性检查值并基于true false设置特定文本。然后根据true / false值突出显示具有css样式的行。

只是中继者拥有自由的一个例子。

很抱歉这么长的回复,但我知道当我被困住时,我喜欢同样的反馈。

好运,祝你好运!