2011-02-16 72 views
6

我认为这是正确的术语...是否可以使用匿名类型进行数据绑定?

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

但是,它并没有通过非常正确的格式 - 例如,如果EndDate为null(这是一个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> 

回答

2

你有两个o宣告你ptions结果列表:

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

是的,你可以绑定针对匿名类型,但你的代码来生成这些类型的序列将有改一下:

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

有没有办法做到这一点不把所有的逻辑是线上?它可以使它非常不可读,特别是如果你合并了两个可能为空的字符串,例如`fullname = q.user.title + q.user.firstname + q.user.lastname;`如果用户为空,它会失败,并且执行三个内联检查并将它们组合成一个变量是非常可怕的。 – NibblyPig 2011-02-16 13:58:34

1

你可以采取安卓样本:

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"; 
    } 

是你换货什么?

问候, 克里斯

相关问题