如何获取WorkItem的所有字段?

时间:2016-04-18 20:55:02

标签: c# field tfs2013

我正在尝试从Risks中的tabs检索TFS字段,但是,当我打印所有Fields时,我看不到{ {1}}。

我尝试通过Risks直接访问它,但没有运气。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用WIQL Queries获取所有字段的值。以下是所有Work item field index的列表。以下是如何获取特定项目的所有工作项和所有字段的示例:

using Microsoft.TeamFoundation.WorkItemTracking.Client;

Query query = new Query(
     workItemStore, 
     "select * from issue where System.TeamProject = @project",
     new Dictionary<string, string>() { { "project", project.Name } }
);

var workItemCollection = query.RunQuery();
foreach(var workItem in workItemCollection) 
{
   /*Get work item properties you are interested in*/
   foreach(var field in workItem.Fields)
   {
      /*Get field value*/
      info += String.Format("Field name: {0} Value: {1}\n", field.name, field.Value);
   }
}

答案 1 :(得分:0)

我想有点晚了,但是因为它可能仍然对某人有所帮助,所以无论如何我都会发布这个。即使你没有指明,如果你在前端或后端。

tl; dr:尝试省略请求中的字段参数。

背景:我想在pull requests details-view中提供更多工作项详细信息,因此我为TamperMonkey创建了一个用户脚本。这意味着我没有“直接”访问TFS,因为我只通过JavaScript访问前端。

和你一样,我也注意到TFS没有输出所有字段。为了解决这个问题,我随后用jQuery修改了TFS ajax请求以省略fields-parameter。然后TFS开始返回工作项的所有现有字段。

我在TFS documentation for work-items

中找到了相关信息
  

字段(字符串)
  以逗号分隔的列表,其中包含每个工作项最多100个字段。   如果未指定,则返回所有字段。

如果实际上是你的用例,我也提供了我编写的脚本来修改ajax请求:

// by Joel Richard -> http://stackoverflow.com/a/26849194/4524280
function parseParams(str) {
    return str.split('&').reduce(function (params, param) {
        var paramSplit = param.split('=').map(function (value) {
            return decodeURIComponent(value.replace('+', ' '));
        });
        params[paramSplit[0]] = paramSplit[1];
        return params;
    }, {});
}

$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
    // Modify ajax request to return all fields... definitely not a hack :D
    if(options && options.url && options.url.indexOf('_apis/wit/workItems') >= 0) {
        var parsedData = parseParams(options.data);
        delete parsedData.fields;
        options.data = $.param(parsedData);
    }
});

$(document).ajaxComplete(function(event, request, settings) {
    // trigger after ajax is complete to get values
    if(settings && settings.url && settings.url.indexOf('_apis/wit/workItems') >= 0 && request.responseJSON) {
        var workItemsData = request.responseJSON.value;
        // -> workItemsData.fields contains all existing fields
    }
});

仅适用于协议:我认为任何人都不应该在“正常”用例中使用$ .ajaxPrefilter,但在这种情况下,我没有太多选择。