无法在Eval中验证TFS工作项字段

本文关键字:TFS 工作 字段 验证 Eval | 更新日期: 2023-09-27 18:04:42

我有一个TFS工作项字段,它似乎对大多数工作项都存在,但有时并不存在。

我正在尝试使用WorkItemCollection在列表视图中绑定这些工作项,除了当我尝试绑定该字段时,一切都有效。

字段本身在查询选择中指定并且不给出错误。然而,获取该字段而不会在某些工作项上抛出错误的唯一方法如下(在.cs中)::

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

由于这些工作项处于只读模式,所以我不能强制写入值等。(除非我返回与工作项配对的值的dictionary,但我不认为这将是最好的解决方案…)

我想做的是在Listview ItemTemplate中,像这样::

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

但是我得到'Contains'不是一个有效的'Fields'属性(因为它是一个集合方法)-我坚持使用eval

如何正确计算和显示"症状"字段?

无法在Eval中验证TFS工作项字段

如果您使用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);
            }

        }
    }
}

使用OnItemDataBound

似乎没有什么可以直接在页面上工作,所以我放弃了这种方法,并试图在代码后面解决我的问题,因为我已经能够在前面整理它了。

我从我的页面中删除了我的sourceObject,而是用编程的方式将我的列表视图数据绑定。(此步骤不需要)

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

然后我使用OnItemDatabound事件能够管理被绑定的每个项目,我检查是否存在被绑定的数据项恼人的症状字段,并填写适当的控件,如果它这样做(所有这些都取代了一个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();
      }
    }
  }
}