【问题标题】:Right way to implement data binding in ASP.NET在 ASP.NET 中实现数据绑定的正确方法
【发布时间】:2009-04-08 22:18:02
【问题描述】:

什么是实现DataBind()方法的正确方法来控制内部有一个中继器?

这些是此控件的要求(但如果您认为这些缺少某些内容或者是开销,您可以提供您的要求)

  • 控件应接受集合或可枚举(对象列表、匿名对象、字典或数据表)
  • DataSource 应该完全应该与控件完全解耦(使用 Data*Field 属性来指定映射的属性或键;如 DropDownList 中的 DataValueField 和 DataTextField)
  • 控件在 ViewState 上应该很容易。如果可能的话,根本不应该使用 ViewState,或者它的使用率应该尽可能低(存储一些 ID 或类似的东西)
  • 该控件应处理任何类型(使用 ToString() 进行转换)
  • ItemDataBound 内部可以使用 e.DataItem 应该可以访问

我希望我的控件像这样初始化:

var control = new Control();
control.DataDateField = "Date";
control.DataNameField = "FullName";
control.DataTextField = "Comment";
control.DataSource = data;
control.DataBind();

并且数据项可以是以下之一

字典列表(或表格行)

var data = new List<Dictionary<string, string>>
{
    new Dictionary<string, string>
        {{"Date", "2009-03-15"}, {"FullName", "John Walker"}, {"Comment", "comment1"}},
    new Dictionary<string, string>
        {{"Date", "2009-03-12"}, {"FullName", "Chuck Norris"}, {"Comment", "comment2"}},
    new Dictionary<string, string>
        {{"Date", "2009-03-13"}, {"FullName", "Sergej Andrejev"}, {"Comment", "comment3"}}
};

匿名对象列表

var data = new List<object>
{
    new {Date = "2009-03-15", FullName = "John Walker", Comment = "comment1"},
    new {Date = "2009-03-12", FullName = "Chuck Norris", Comment = "comment2"},
    new {Date = "2009-03-13", FullName = "Sergej Andrejev", Comment = "comment3"},
};

项目列表

public class SampleClass
{
    public object Date { get; set; }
    public object FullName { get; set; }
    public object Comment { get; set; }

    public SampleClass(string date, string fullName, string comment)
    {
        Date = date;
        FullName = fullName;
        Comment = comment;
    }
};

var data = new List<SampleClass>
{
    new SampleClass("2009-03-15", "John Walker", "comment1"),
    new SampleClass("2009-03-12", "Chuck Norris", "comment2"),
    new SampleClass("2009-03-13", "Sergej Andrejev", "comment3"),
};

数据表

var data = new DataTable();
data.Columns.Add(new DataColumn { DataType = typeof(DateTime), ColumnName = "Date" });
data.Columns.Add(new DataColumn { DataType = typeof(string), ColumnName = "FullName" });
data.Columns.Add(new DataColumn { DataType = typeof(string), ColumnName = "Comment" });

data.Rows.Add(new object[] { DateTime.Parse("2009-03-15"), "John Walker", "comment1" });
data.Rows.Add(new object[] { DateTime.Parse("2009-03-12"), "Chuck Norris", "comment2" });
data.Rows.Add(new object[] { DateTime.Parse("2009-03-13"), "Sergej Andrejev", "comment3" });

基本上我想要的是用于数据绑定的通用代码,这样我就不会在每次创建新控件时都浪费时间从头开始创建它。如果您能提供任何关于良好做法、官方指南以及您的个人经验的参考资料,我将不胜感激。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    本文使用模板构建了一个示例数据绑定控件:

    Building DataBound Templated Custom ASP.NET Server Controls

    【讨论】:

      【解决方案2】:

      这就是我认为您正在寻找的东西......

      http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.databoundcontrol.aspx

      它是您的控件可以继承的基类...

      【讨论】:

        【解决方案3】:

        每种方式可能都有其优点和缺点。这是我看到的:

        1. 字典很好,因为它们是非常常见的对象,每个人都应该知道如何使用和操作它们。不过语法会变得很丑。

        2. 匿名对象外观漂亮、语法简洁,而且它们还擅长快速实现一次性解决方案。我尝试将它们用于类似的东西,但很快就遇到了一些限制,所以如果你需要对它们做真正的“工作”,你最终可能不得不废弃它们。

        3. 对象列表类似于字典,但有助于更轻松地理解您要完成的工作。你有更高的可读性和更容易理解,但它是你库中的另一个对象,只会被使用一次。对于一个简单的问题,可能打字太多了。

        4. 我想我曾经像您之前那样使用过 DataTables,因为我不知道自己在做什么。如果它介于字典和字典之间,请使用字典,因为它们是更常见和通用的对象。

        只是我的 $.02 美元,但它确实归结为对您正在解决的问题最重要的东西(可读性/一致性/可理解性/...),以及您当前的代码库中是否已经存在和约定。

        标记

        【讨论】:

        • 我希望我的控件能够接受所有 4 种方式,而不仅仅是选择其中一种方式
        【解决方案4】:

        我知道这并不能完全回答您的问题,但作为补充信息:

        您可能还想查看ASP.NET Dynamic Data。它使用绑定属性的数据类型来确定要显示的控件/用户控件的类型。它还根据数据在整个域/业务对象模型的上下文中表示的内容添加了附加功能。 (如果是ID字段、外键等)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-24
          • 2016-12-20
          • 2017-10-14
          • 2015-06-19
          相关资源
          最近更新 更多