在ASP.NET中实现数据绑定的正确方法

Ser*_*jev 3 c# asp.net

为控件实现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();
Run Code Online (Sandbox Code Playgroud)

数据项可以是以下之一

字典列表(或表格行)

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"}}
};
Run Code Online (Sandbox Code Playgroud)

匿名对象列表

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"},
};
Run Code Online (Sandbox Code Playgroud)

对象列表

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"),
};
Run Code Online (Sandbox Code Playgroud)

数据表

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" });
Run Code Online (Sandbox Code Playgroud)

基本上我想要的是数据绑定的通用代码,所以每次创建新控件时我都不会浪费时间从头开始创建它.我将不胜感激任何良好做法,官方指南以及您的个人经历.

Jas*_*tes 6

本文使用模板编写一个示例数据绑定控件:

构建DataBound模板化自定义ASP.NET服务器控件