将规则应用于工作项字段

根据字段的数据类型,你可以针对输入该字段的数据设置各种限制。 你可以为选取列表(下拉菜单)指定值、设置默认值、清除条目或限制更改。 通过条件规则,你可以基于不同字段值之间的依赖关系对字段应用规则。 你还可以限制能修改字段的人员或将规则的作用域限制为仅适用于组。

所有这些规则元素都可以在工作项类型 (WIT) 定义的 FIELD 定义内定义,但应遵循某些系统字段限制。 并且,除 HELPTEXT 以外,你还可以指定这些规则在工作流转换期间生效,或将这些规则指定为 FIELD(全局工作流)元素内的子元素。

工作项跟踪 XML 元素字段规则

你可以根据本主题中的说明为字段定义任何规则组合。

帮助文本:为字段指定在工作项窗体中显示的工具提示文本。

选取列表:指定允许值、建议值和禁止值的下拉菜单或选取列表。

分配值规则:定义运行时行为和约束:

  • 清除、设置默认值、复制值或强制值与模式匹配

  • 要求、只读以及限制分配到字段的值

  • 限制可以创建或修改工作项的人员

条件规则:指定将规则集应用于父字段的时间。

基于用户角色设置条件: 基于正在创建或修改工作项的人员应用规则。

使用令牌指定组:为正在使用正确令牌的组指定域和范围。

哪些规则可应用于系统字段?

如何避免人名字段上的验证错误?

能否定义多选择的选取列表?

应该在何处应用字段规则?

如何计算规则? 适用什么顺序?

窗体中的键击条目如何影响规则计算?

如何修改“状态”和“原因”字段?

如何使字段的值为两个其他字段的和?

何时可以使用全局工作流定义字段规则?

字段规则是你必须自定义工作项跟踪的一个组件。 若要了解更多信息,请参见 自定义工作跟踪对象以支持团队的进程

有关修改字段或将字段规则添加到 WIT 定义文件的信息,请参阅定义工作项字段

帮助文本

你可以自定义当用户指向工作项窗体中出现的字段时显示的帮助文本和工具提示文本。 你可以自定义和本地化出现在不同 WIT 和不同团队项目中的相同字段的帮助文本。 帮助文本限制为 255 个 Unicode 字符。

下面的示例显示将帮助文本分配给自定义的“业务理由”字段:

<FIELD name=”Business Justification” refname="Fabrikam.BusinessJustification" type="String">
<HELPTEXT>Only required when you set the Urgencyfield to Need Immediately. </HELPTEXT>
</FIELD>

若要提供超过 255 个字符限制的用户指南,请参阅在工作项窗体上提供帮助文本、超链接或 Web 内容

备注

HELPTEXT 的存在增加了所存储数据的大小并会影响可扩展性。如果单个 TFS 实例中支持数百个团队项目,请保守使用 HELPTEXT 规则。

选取列表规则

选取列表规则定义用户可以或不能为“字符串”字段选择的值。 选取列表中定义的值显示在工作项窗体和查询编辑器中。 你可以组合列表,展开或收起列表。 你还可以使用 fornot 特性来基于修改工作项的人员应用或忽略这些规则。

规则

用法

ALLOWEDVALUES

基于特定的值限制用户可以选择的值。

ALLOWEXISTINGVALUE

允许字段保留现有值,即使它不再位于选取列表中。 当更改包含人名的一个或多个选取列表中的字段值时,建议包含此规则。

GLOBALLIST

指定包含为团队项目或团队集合保留的值的全局列表的名称。

PROHIBITEDVALUES

防止分配指定的值。 如果字段包含禁止的值,则无法保存工作项。

SUGGESTEDVALUES

定义用户可以从中选择的值列表,但不限制为选择。 用户可以指定本列表以外的值。

有关使用选取列表的示例,请参阅定义选取列表

分配值规则

分配值规则定义运行时行为和约束,如指定默认值、清除字段、要求定义字段等。 你可以使用 fornot 特性来基于修改工作项的人员应用或忽略这些规则。

清除、设置默认值、复制值或强制值与模式匹配

这些规则支持设置默认值、将值从一个字段复制到另一个字段,或强制字段值与规定的模式匹配。

规则

用法

COPY

当用户在创建或修改工作项时,将指定值复制到字段。

DEFAULT

当用户在创建或修改工作项时,为空的字段指定值。 如果字段已经具有值,则忽略 DEFAULT 规则。

EMPTY

清除包含任何值的字段,然后在用户保存工作项时将字段设置为只读。 不得将 EMPTY 用于 READONLY

EMPTY 主要在状态转换期间使用,以清除应用于项转换为的状态的字段。

MATCH

强制在“字符串”字段中输入内容,以符合特定的字符或数字模式

SERVERDEFAULT

当用户保存工作项时,将当前用户名或服务器时钟值复制到字段。 这些字段通常在窗体上显示为只读。

有关语法结构和示例,请参阅定义默认值或将值复制到字段

要求、只读以及限制分配到字段的值

这些规则对指定或更改字段值设置限制。

规则

用法

CANNOTLOSEVALUE

防止用户在指定值后清除字段的值。

FROZEN

防止用户在包含值后更改字段的值。 一旦用户将工作项和值保存在该字段,该值将无法再被修改。

NOTSAMEAS

防止对字段分配与另一个字段相同的值。

READONLY

防止修改字段。 你可能希望在特定情况下应用此规则。 例如,在工作项关闭后,你希望使字段成为只读字段以保留数据进行报告。

请勿将 READONLY 用于 EMPTY 元素,因为 READONLY 也会将字段设置为只读。 如果结合这些元素,结果将会不一致。

另外,你可使用 Control 元素 ReadOnly 属性使字段在工作项窗体中显示为只读。 可通过其他客户端写入该字段,但无法通过工作项窗体进行。

REQUIRED

要求用户为字段指定值。 用户无法保存工作项,除非已对所有必填字段分配了值。

有关语法结构,请参阅所有 FIELD XML 元素引用

限制可以创建或修改工作项的人员

你可以通过对人名字段应用 VALIDUSER 元素控制能创建或修改工作项的人员。 当指定此元素时,指示哪个用户或用户组可以分配为字段的值。 你可以将此元素设置为支持可选的 group 特性,这要求分配给字段的人员必须是所指定组的直接或间接成员。 默认情况下,可以在字段中指定“Team Foundation 有效用户”组的所有成员。

VALIDUSER 元素仅对“字符串”字段类型有效。 你可以通过分别为 for 或 not 特性指定用户和组允许或限制规则是否适用于修改工作项的用户。

<VALIDUSER group="groupName" for="userName" not="userName" />

仅当引用人名字段时才能使用 VALIDUSER 规则。 以下系统字段是人名字段的示例:

  • 激活者 (System.ActivatedBy)

  • 分配对象 (System.AssignedTo)

  • 授权权限 (System.AuthorizedAs)

  • 更改者 (System.ChangedBy)

  • 关闭者 (System.ClosedBy)

  • 创建者 (System.CreatedBy)

除系统字段外,你还可以创建自定义的字符串字段并将其用作人名字段。 此外,你还可以将自定义的人名字段与 Active Directory 保持同步(指定 syncnamechanges="true")。

工作项字段不区分不同域中的用户标识。 因此,当输入使用 VALIDUSER 规则的字段时,“Fabrikam\ctsoapo”和“Contoso\ctsoapo”被视为相同的用户。

条件规则

通过条件规则,你可以指定将规则集应用于父字段的时间。 你可以基于是否对(或不对)另一个字段分配指定的值或是否更改(或不更改)另一个字段设置条件。 你可以在条件规则元素中包含选取列表和分配值规则。

规则

用法

WHEN

指定在对另一个字段分配指定值时适用于父字段的规则。

WHENNOT

指定在不对另一个字段分配指定值时应用于父字段的规则。

WHENCHANGED

指定在指定的字段值更改时应用于父字段的规则。

WHENNOTCHANGED

指定在指定的字段值不更改时应用于父字段的规则。

每个字段可以指定多个条件规则。 但是,每个条件规则只能指定一个驱动字段。 不能嵌套条件规则。 有关语法结构和示例,请参阅分配基于条件的值和规则

基于创建或修改工作项的人员应用或忽略规则

你可以通过使用 for 或 not 特性使选取列表或分配值规则应用于或不应用于用户组。 将规则的作用域限制为组。 若要使规则适用于多个组,你必须创建包含你希望使用的组集的父 TFS 组。

  • 将字段设置为特定组的必填字段:

    使用 for 将规则应用于组。 本示例要求“初级分析师”组中的用户填写“审批者”字段。

    <FIELD name="Second Approver">
    <REQUIRED for="Example1\Junior Analysts"/>
    </FIELD>
    
  • 将字段的修改限制为用户组:

    使用 not 将组从规则中排除。 本示例将“会审说明”字段定义为对“会审委员会”组中成员以外的成员只读。

    <FIELD name="Triage Description">
    <READONLY not="[Project]\Triage Committee" />
    </FIELD>
    
  • 将字段设置为对某些用户而非其他用户必填:

    结合使用 fornot 以同时将规则应用于某些用户而不应用于其他用户。 本示例将“严重级别”定义为“项目成员”组中用户的必填字段,但不是“项目管理员”组中用户的必填字段。

    <FIELD name="Severity">
    <REQUIRED for="[Project]\Project Members" not="[Global]\Project Admins"/>
    </FIELD>
    

    由于 Deny 的优先级比 Allow 高,如果用户位于这两个组中,将强制执行“not”,字段也不是必填的。

使用令牌来引用组

当将规则限制到组时,你必须指明组的域或作用域。 对于某些值,你可以使用令牌。

人名字段可以接受同时引用用户和组的值。 字段特性(for 和 not)适用于组。 当为这些项指定值时,你可以使用以下令牌。

  • 将作用域限制为团队项目 – [Project]:

    [Project] 令牌用于指定为团队项目定义的组。 这对应于团队的内置 TFS 组,如 [Project]\Contributors 组、你在项目级别创建的自定义 TFS 组或你添加到 TFS 组的 Windows 组。 例如:

    • 团队:[Project]\Fabrikam Team

      创建团队时,创建包含分配给团队的成员的 TFS 组。

    • 团队项目组:[Project]\Contributors

    • 添加到团队项目的 Windows 组:[Project]\ Triage Committee

    **提示:**你可以通过在 Team Web Access (TWA) 管理上下文中打开“严重级别”页面查看有效组的列表。

  • 将作用域限制为项目集合 – [CollectionName]:

    使用 [CollectionName] 引用作用域为集合的 TFS 组,如“项目集合管理员”组或你添加到集合的 Windows 组。 例如:

    <FIELD name="Title">
    <READONLY for="[DefaultCollection]\Project Collection Valid Users"/>
    </FIELD>
    
  • 将作用域限制为服务器实例 – [GLOBAL]:

    使用 [GLOBAL] 令牌引用作用域为集合的 TFS 组,如内置的组或你添加到服务器级别组的 Windows 组。 例如:

    <FIELD name="Title">
    <READONLY for="[Global]\Team Foundation Valid Users"/>
    </FIELD>
    
  • 指定域限定帐户或组:

    域限定帐户名称(如下面的示例所示)可用于引用域用户或组。 注意,某些规则仅支持组而不支持引用域用户。

    <LISTITEM value="FABRIKAM\Christie Church’s Direct Reports"/>
    

所有用户和组必须由其中一个令牌限定。 例如,由于其未使用有效的令牌限定特定的组,以下 XML 无效。

<FIELD name="Title">
<READONLY for="Dev Team"/>
</FIELD>

问题解答

问:哪些规则可应用于系统字段?

**答:**系统字段具有 Sytem.Name 引用名称,例如 System.Title 和 System.State。 TFS 限制这些字段的自定义,以下实例除外:

  • HELPTEXT 规则可分配给所有字段。

  • READONLY 规则可分配给“状态”和“原因”字段。

  • 大多数规则都可以分配给“标题”、“分配对象”、“说明”或“更改者”系统字段。

问:如何避免人名字段上的验证错误?

**答:**若要避免在成员离开团队或不再以项目参与者身份注册时发生验证错误,请包括“分配对象”字段的 ALLOWEXISTINGVALUE 元素。

<FIELD name="Assigned To" refname="System.AssignedTo" type="String" syncnamechanges="true" reportable="dimension">
   <HELPTEXT>The user who is working on this work item</HELPTEXT>
   <ALLOWEXISTINGVALUE />
   <VALIDUSER />
   <ALLOWEDVALUES expanditems="true" filteritems="excludegroups">
      <LISTITEM value="Active" />
      <LISTITEM value="[project]\Contributors" />
   </ALLOWEDVALUES>
   <DEFAULT from="field" field="System.CreatedBy" />
</FIELD>

问:能否定义多选择的选取列表?

**答:**此功能不受本机支持,但是,你可以采用本 CodePlex 项目中提供的源代码:用于 TFS 工作项跟踪的自定义控件

问:如何修改“状态”和“原因”字段?

答:“状态”和“原因”字段在 WIT 定义的 WORKFLOW 部分定义。 你可以指定在更改状态、选择原因或进行特定转换期间应用于字段的大多数字段规则。 若要了解更多信息,请参见 更改工作项类型的工作流

问:应该在何处应用字段规则?

**答:**当你希望规则在工作项的整个生命周期应用于字段时,请在 FIELD 定义中指定。 例如,对于新的活跃 bug,字段保持必填,直至 bug 关闭。

否则,请指定将仅在状态更改时计算的规则。 这些规则在 STATEREASONTRANSITION 元素的 WORKFLOW 部分定义。 除 HELPTEXT 外的所有规则都可以在 FIELD(工作流)元素中应用。

字段规则是附加的。 即,你可以为相同的字段指定四组规则,这些规则都将由工作项规则引擎计算。

  • 无论工作项在其状态模型中的位置如何,特定于工作项类型的规则均适用。 例如,<REQUIRED /> 规则执行以下检查:

    "MyField Value" != NULL

  • 当处于特定的状态时,特定于状态的规则作用于工作项实例。 当以下条件为真时,强制实施特定于状态的规则:

    State field value == "MyState" && "MyField Value" != NULL

  • 为特定转换指定的特定于转换的规则作用于经历特定转换的工作项。 当以下条件为真时,强制执行这些规则:

    State field value == "ToState"  &&

    "Previous State Before Edit/New" == "FromState"

    && "MyField Value" != NULL

  • 为特定原因指定的特定于原因的规则作用于特殊转换的特殊原因。 当以下条件为真时,处理这些规则:

    Reason field == "MyReason" &&

    State field value == "ToState"  &&

    "Previous State Before Edit/New" == "FromState" && "MyField Value" != NULL

下面的示例限制当工作项处于“活动”状态时客户严重级别字段的修改。

<STATE name="Active">
   <FIELDS>
      <FIELD refname="MyCorp.Severity" >
         <READONLY />
      </FIELD>
   </FIELDS>
</STATE>

问:如何计算规则?适用什么顺序?

**答:**规则通常按其列出的顺序处理。 但是,当你使用 WHEN*、DEFAULT 和 COPY 元素时,其他行为可能适用。

你可以获得关于在向字段应用多个规则时如何计算规则的一些思路。 规则的计算方式并不完全确定。 本部分介绍当你使用 WHEN*DEFAULTCOPY 规则时预期的行为和交互。

以下步骤按正确的顺序显示 TFS 执行的和工作项窗体用户执行的交互。 仅步骤 1、8 和 13 是由用户执行的。

  1. 用户可以从 Team Foundation 客户端(如 Visual Studio、Team Explorer、Team Web Access 或 Team Explorer Everywhere)创建新工作项或编辑现有工作项。

  2. 填写字段默认值。 对于所有字段,请使用 WHEN* 规则外部的任何 DEFAULT 规则。

  3. 复制字段值。 对于所有字段,请使用 WHEN* 子句外部的任何 COPY 规则。

  4. 对于具有匹配的 WHEN 规则的所有字段,首先执行 DEFAULT,然后执行内部的 COPY 规则。

  5. 对于具有匹配的 WHENNOT 规则的所有字段,首先执行 DEFAULT,然后执行内部的 COPY 规则。

    TFS 始终先处理 WHEN 规则,再处理 WHENNOT 规则。

  6. 对于从步骤 1 就更改了值的以及包含 WHENCHANGED 规则的所有字段,首先执行 DEFAULT,然后执行内部的 COPY 规则。

  7. 允许用户开始编辑。

  8. 用户更改字段值,然后从字段移动焦点。

  9. 对与新值匹配的字段引发任何 WHEN 规则。

  10. 对与新值匹配的字段引发任何 WHENNOT 规则。

  11. 对与新值匹配的字段引发任何 WHENCHANGED 规则。

  12. 返回用户的编辑能力。

  13. 用户将更改保存到数据库。

  14. 对于所有字段,执行在 WHENWHENNOT 规则下直接或间接为字段定义的 SERVERDEFAULT 操作。

问:窗体中的键击条目如何影响规则计算?

**答:**每当用户通过 UI 工作项窗体在字段中输入键击时,系统都会为字段设置新的值。 这意味着当满足规则的前提条件时可能会意外发生条件规则。

在下面的 XML 示例中,当你在“状态”字段中键入“Approved Again”时,子状态将为空,因为只要用户键入 Approved 中的字母“e”,就会应用 WHEN* 规则,即使预期的最终状态不是“Approve”。 因此,当你使用条件规则时,请细致思考。

<FIELD refname="MyCorp.SubStatus" />
<WHEN field="MyCorp.Status" value="Approve" >
<EMPTY />
</WHEN>
</FIELD>

问:如何使字段的值为两个其他字段的和?

**答:**此功能当前不受本机支持。

问:何时可以使用全局工作流定义字段规则?

**答:**仅当你在执行在多个团队项目中维护具有相同定义和规则的多个字段的任务时,才能使用全局工作流。 与全局列表类似,使用全局工作流可以最大程度地减少更新字段定义时所需的工作量。 有关详细信息,请参阅自定义全局工作流

请参见

概念

所有 WITD XML 元素引用

其他资源

定义工作项字段