Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据绑定:Eval()与Container.DataItem转换——最佳实践_C#_Asp.net_Data Binding_Eval - Fatal编程技术网

C# 数据绑定:Eval()与Container.DataItem转换——最佳实践

C# 数据绑定:Eval()与Container.DataItem转换——最佳实践,c#,asp.net,data-binding,eval,C#,Asp.net,Data Binding,Eval,我需要在3-4个文件中将15-20个字段绑定到Repeater(所以,数据绑定字段的总数必须大约为60个)。我读了一些关于如何做到这一点的技术文章,了解了这两种方法的优缺点 Eval()。嗯,我不在乎表现。0.1秒或0.2秒加载页面-谁在乎呢。可维护性和代码的简单性是我的目标。如我所见,Eval()的主要缺点是它不是强类型的。此外,它接受字段名作为字符串(?!!)。所以,如果有一天我重构我的代码并重命名底层对象的字段,我的代码将被无声地破坏,并在运行时开始崩溃。我说得对吗 ((TYPE)Cont

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

Eval()。嗯,我不在乎表现。0.1秒或0.2秒加载页面-谁在乎呢。可维护性和代码的简单性是我的目标。如我所见,
Eval()
的主要缺点是它不是强类型的。此外,它接受字段名作为字符串(?!!)。所以,如果有一天我重构我的代码并重命名底层对象的字段,我的代码将被无声地破坏,并在运行时开始崩溃。我说得对吗

((TYPE)Container.DataItem).Field
看起来很难看(尤其是重复多次时)。但是它是强类型的,并且排除了可能的bug。对吧?


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

我建议使用强类型控件,如ListView:


在.NET 4.5中,这些控件已经过优化,将为您提供两方面的最佳效果。

我建议使用强类型控件,如ListView:


在.NET 4.5中,这些控件已经过优化,将为您提供两个方面的最佳效果。

很抱歉回答得太长了

我不确定我是否完全了解你的3-4个文件,但这里是我们倾向于做的。另外,首先让我说99.9%的时间我们使用中继器,因为您在数据的布局和格式方面具有灵活性。是的,还有其他一些控件,通过一些内置功能使基本数据绑定更容易,但大多数情况下,您不需要所有的开销

我们通常创建一个类来绑定到中继器。因此,如果需要组合多个数据源,可以使用不同的预定义输入实例化该类。此时,您需要做的就是为要绑定到中继器的每个字段创建属性。使用这些属性,您可以随心所欲地格式化数据。例如,将名字和姓氏合并到fullname属性中。因此,如果您需要重构代码,因为有人希望您更改名称格式,那么您所要做的就是更改format类,并且您的中继器永远不必更改

<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>
rowclass属性是可以使用这些属性进行操作的一个示例。如果您注意到开头的TR标记,它的Eval语句是Eval(“RowClass”),但它被分配给TR上的css“class”标记。实际类中的RowClass属性检查一个值,并基于true-false设置一个特定文本。然后根据真/假值使用css样式高亮显示行

这只是一个例子,说明你可以自由使用中继器

很抱歉回复太长,但我知道当我陷入困境时,我喜欢同样的反馈


祝你好运

很抱歉回复这么长

我不确定我是否完全了解你的3-4个文件,但这里是我们倾向于做的。另外,首先让我说99.9%的时间我们使用中继器,因为您在数据的布局和格式方面具有灵活性。是的,还有其他一些控件,通过一些内置功能使基本数据绑定更容易,但大多数情况下,您不需要所有的开销

我们通常创建一个类来绑定到中继器。因此,如果需要组合多个数据源,可以使用不同的预定义输入实例化该类。此时,您需要做的就是为要绑定到中继器的每个字段创建属性。使用这些属性,您可以随心所欲地格式化数据。例如,将名字和姓氏合并到fullname属性中。因此,如果您需要重构代码,因为有人希望您更改名称格式,那么您所要做的就是更改format类,并且您的中继器永远不必更改

<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>
rowclass属性是可以使用这些属性进行操作的一个示例。如果您注意到开头的TR标记,它的Eval语句是Eval(“RowClass”),但它被分配给TR上的css“class”标记。实际类中的RowClass属性检查一个值,并基于true-false设置一个特定文本。然后根据真/假值使用css样式高亮显示行

这只是一个例子,说明你可以自由使用中继器

很抱歉回复太长,但我知道当我陷入困境时,我喜欢同样的反馈


祝你好运

“.1s或.2s加载页面-谁在乎”?你的用户会。我们的实验表明,将搜索结果页面的速度降低100到400毫秒会对每个用户的搜索次数产生可测量的影响,即-0.2%到-0.6%。对于电子商务网站。。。你的网站速度越慢,你可能会赔钱。加载一个页面需要0.1秒或0.2秒,谁在乎呢?你的用户会。我们的实验表明,将搜索结果页面的速度降低100到400毫秒会对每个用户的搜索次数产生可测量的影响,即-0.2%到-0.6%。对于电子商务网站。。。你的网站速度越慢,你可能会赔钱。好吧,你的答案正是我现在的答案:为每个
转发器
单独设置类,在
页面加载
中预先设置所有必填字段的格式,并绑定到
转发器
。我喜欢这种建筑。如我所见,您使用
Eval(“字段”)
。但是也可以在那里使用
((TYPE)Container.DataItem).Field
。这是一个问题。你可以这样做,但每个都有权衡。如上所述,Eval进行后期绑定并使用反射,但您也只需触摸viewmodel进行更改。使用dataitem,您必须强制转换性能更好的数据项,但您需要更多的维护。我认为这是一个业务决策,您需要做出决定,以确定性能是否可以进行较少的修改。测试和性能只是根据所有因素决定的