2011-02-16 103 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"; 
    } 

是你換貨什麼?

問候, 克里斯

相關問題