【问题标题】:TFS workitem field cannot be validated in Eval无法在 Eval 中验证 TFS 工作项字段
【发布时间】:2017-01-07 06:13:19
【问题描述】:

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

我正在尝试使用 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>

但我得到“包含”不是有效的“字段”属性(因为它是一种收集方法) - 我被 eval 卡住了

如何正确评估和显示症状字段?

【问题讨论】:

  • 您使用的是哪个版本的 TFS?您使用 CMMI 流程模板吗?我检查了我的 TFS 2015.3,只有 Bug 工作项包含 CMMI 流程模板中的症状字段。你的意思是你想用 TFS api 获取这个字段吗?
  • 你能不能分享你的代码?
  • @Cece-MSFT ,这正是问题所在,对于任何不是“错误”工作项的工作项,没有症状字段 - 所以我不能直接绑定该字段,它会抛出一个错误。我需要在它存在时绑定它,但我很难在 html 页面中这样做
  • @Eddie-MSFT ,嗯,这正是我发布的内容。通过代码(.cs / pagebehind),我可以很好地获取第一个代码块中显示的字段,在页面中,我无法评估该字段是否存在-它会引发错误->查看第二个代码块跨度>

标签: c# html asp.net tfs wiql


【解决方案1】:

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


        }
    }
}

【讨论】:

  • .net API 部分正是我已经说过的工作(我的帖子中的第一个代码块) - 问题是将 workitemcollection 绑定到列表视图并使用症状字段(并不总是存在) .
【解决方案2】:

使用 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();
      }
    }
  }
}

【讨论】:

  • 我不会接受这个作为答案(也是因为我问了这个问题),因为它没有直接回答这个问题 - 如何让它直接在 aspx.page 中工作,使用 eval或 w/e。我发布它以防其他人遇到同样的问题,因为它确实解决了它。
猜你喜欢
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多