【问题标题】:Is it possible to databind using an anonymous type?是否可以使用匿名类型进行数据绑定?
【发布时间】:2011-02-16 13:47:42
【问题描述】:

我认为这是正确的术语...

基本上,我有一个转发器控件和一个检索一些项目的 Linq 查询。通常我会直接将数据绑定到查询并使用 Eval 将结果填充到模板中。

但是,它并没有以完全正确的格式出现 - 例如,如果 EndDate 为空(它是 DateTime?),那么我想用“Present”替换它。我只使用了查询结果对象中的几个属性。

我想知道是否有类似的解决方案:

[pseudo madeup code]
var query = getResults();

List<anonymous> anonList = new List();

foreach (var q in query)
{
   string myEndDate = "";
   if (q.EndDate.HasValue) 
       { myEndDate = q.EndDate.ToString(); }
   else 
       { myEndDate = "Present"; }

   anonList.items.add(new { name=q.name, enddate=myEndDate };
}

repeater.Datasource = anonList;

然后

<div><%#Eval("enddate")%></div>

【问题讨论】:

    标签: c# asp.net repeater


    【解决方案1】:

    您有两个选项来声明您的结果列表:

    1. 使用非通用ArrayList,或
    2. 使用Enumerable.Repeat,即。 var anonList = Enumerable.Repeat(new { name="", enddate=""}, 0).ToList();

    【讨论】:

      【解决方案2】:

      是的,您可以绑定匿名类型,但是生成这些类型的序列的代码必须稍作更改:

      repeater.DataSource
          = getResults()
              .Select(q => new {
                  name = q.name,
                  enddate = (q.EndDate.HasValue) 
                              ? q.EndDate.ToString() 
                              : "Present"
              });
      

      【讨论】:

      • 有没有办法在没有所有逻辑的情况下做到这一点?它可能使它变得非常难以阅读,特别是如果您将两个可能为空的字符串组合在一起,例如fullname = q.user.title + q.user.firstname + q.user.lastname;,如果用户为空,它将失败,并且执行三个内联检查并将它们组合成一个变量是非常可怕的。
      【解决方案3】:

      你可以拿安德鲁斯样本:

      repeater.DataSource    = getResults()
          .Select(q => new {
              name = q.name,
              enddate = (q.EndDate.HasValue)
                           ? q.EndDate.ToString()
                           : "Present"        });
      

      但不是计算内联结束日期,而是调用一个函数:

      repeater.DataSource = getResults()
          .Select(q => new {
              name = q.name,
              enddate = GetEndDate(q)});
      
      
          private void GetEndDate(TypeOfQ q)
          {
             return (q.EndDate.HasValue) ? q.EndDate.ToString() : "Present";
          }
      

      这是你说的吗??

      问候, 克里斯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-06
        • 1970-01-01
        • 2010-12-11
        • 2017-10-25
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多