无法在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
如何正确计算和显示"症状"字段?
如果您使用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();
}
}
}
}