2016-08-30 67 views
0

我有一個TFS工作項目字段似乎存在大多數工作項目,但有時不。TFS工作項目字段無法驗證在Eval

我試圖用WorkItemCollection在列表視圖中綁定這些工作項,除了當我嘗試綁定該字段時,一切正常。

該字段本身在查詢選擇中指定並且不會出現錯誤。然而,爲了獲得場不會對某些工作項拋出一個錯誤的唯一方法是這樣(在的.cs)::

  foreach(WorkItem w in queryResults) 
      { 
      if (w.Fields.Contains("Symptom")) 
      { 
       w.Fields["Symptom"].Value.ToString();//show 
      } 
      } 

,因爲這些工作項都以只讀模式,我不能只寫強制值等等。(除非我返回與工作項目配對的值的字典,但我不認爲這將是最好的解決方案...)

我在試圖做的是在Listview ItemTemplate中,這樣的事情::

   <div class="details"> 
        <%# Server.HtmlEncode(Eval("Fields.Contains(\"Symptom\")? Fields[\"Symptom\"].Value : \"\";").ToString())%> 
       </div> 

但我得到'包含'不是一個有效'領域'屬性(b因爲它的一種收集方法) - 我堅持評估

如何正確評估並顯示我的症狀字段?

+0

哪個TFS的版本,您使用的?你使用CMMI流程模板嗎?我檢查了我的TFS 2015.3,只有Bug工作項包含CMMI過程模板中的症狀字段。你的意思是你想用TFS api來獲得這個領域? –

+0

你能分享你的代碼不能工作嗎? –

+0

@ Cece-MSFT,這正是問題所在,對於任何不是'bug'工作項目的工作項目,沒有任何症狀字段 - 所以我不能直接綁定該字段,它會引發錯誤。我需要綁定它,但它在HTML頁面 – Spacemonkey

回答

0

如果使用TFS 2015或VSTS,則可以使用REST API來獲取症狀字段。該API的樣子:

GET http(s)://{instance}/DefaultCollection/_apis/wit/workitems?ids=xx&fields=Microsoft.VSTS.CMMI.Symptom&api-version=1.0 

或用.NET API:

using Microsoft.TeamFoundation.WorkItemTracking.Client; 
using Microsoft.TeamFoundation.Client; 
using System; 

namespace TestCaseProject 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var tfs = 
     TfsTeamProjectCollectionFactory.GetTeamProjectCollection(
      new Uri("http://tfsserver:8080/tfs/CollectionName")); 
      var service = tfs.GetService<WorkItemStore>(); 

      var wi = service.GetWorkItem(id); 


      foreach (Field field in wi.Fields) 
      { 
       Console.WriteLine("{0}: {1}", field.Name, field.Value); 
      } 


     } 
    } 
} 
+0

。淨API部分正是我已經說過的工作(我的帖子中的第一個codeblock) - 問題是綁定workitemcollection到列表視圖和使用症狀字段(並不總是存在)。 – Spacemonkey

0

使用OnItemDataBound

似乎沒有什麼直接在頁面上工作,所以我感動來自做法,轉而去試圖解決我在代碼隱藏方面的問題,因爲我已經能夠在這方面進行整理了。

我從我的頁面中刪除了我的sourceObject,而是以編程方式代碼隱藏了我的列表視圖。 (這一步是不是必要的)

TFSListView.DataSource = SearchHandler.SearchTFS(searchstring); 
TFSListView.DataBind(); 

然後我用OnItemDatabound事件能夠管理每個項目的約束,我檢查了DataItem的那惱人的症狀領域存在的限制,如果它填補了適當的控制做(這一切都將替換一個EVAL行,所以我還是有點懊惱,但它似乎沒有可以直接在aspx頁面)

protected void TFSListView_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    ListViewDataItem myitem = (ListViewDataItem)e.Item; 

    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
    Control divDetails = e.Item.FindControl("divLsvDetails"); 
    WorkItem myWI = myitem.DataItem as WorkItem; 

    if (myWI != null && divDetails != null) 
    {   
     if (myWI.Fields.Contains("Symptom")) 
     {    
     ((HtmlGenericControl)divDetails).InnerHtml = myWI["Symptom"].ToString(); 
     } 
    } 
    } 
} 
+0

我不會接受這個答案(因爲我問了這個問題),因爲它不直接回答問題 - 如何使用eval或w/e直接在aspx.page中工作。我發佈了它,以防其他人得到同樣的問題,但它確實解決了這個問題。 – Spacemonkey