Forms Orchard自定义表单和工作流-决策节点中脚本的语法

Forms Orchard自定义表单和工作流-决策节点中脚本的语法,forms,content-management-system,workflow,orchardcms,orchardcms-1.7,Forms,Content Management System,Workflow,Orchardcms,Orchardcms 1.7,在Orchard 1.7.1.0中,我有一个带有下拉列表的自定义联系人表单: 首选位置: 北方办事处 |南方办事处 我需要能够根据联系人表格中的选择向相关办公室发送电子邮件。简单是吗 我在工作流中创建了一个决策节点,但我不确定基于令牌的规则语法。。?令牌类似于{Content.Fields.ContactUsForm.PreferredLocation} 帮助文本是您可以使用ContentItem、Services、WorkContext和T.Call SetOutcomestring Outp

在Orchard 1.7.1.0中,我有一个带有下拉列表的自定义联系人表单:

首选位置: 北方办事处 |南方办事处

我需要能够根据联系人表格中的选择向相关办公室发送电子邮件。简单是吗

我在工作流中创建了一个决策节点,但我不确定基于令牌的规则语法。。?令牌类似于{Content.Fields.ContactUsForm.PreferredLocation}

帮助文本是您可以使用ContentItem、Services、WorkContext和T.Call SetOutcomestring Output来定义活动的结果。但是我似乎找不到更多关于语法的东西——我假设它只接受C,正如我在博客文章中看到的那样,但我似乎无法运行一个简单的条件语句

我遇到的问题是什么。。什么事也没有发生。。没有结果被解雇。如果我只是把像SetOutcomeNorth办公室这样的东西放进去;在要执行操作的脚本字段中

这与这篇文章类似,但作者没有跟进他是如何进入的,他被建议使用规则,因此可能与1.7.1 Orchard不太相关。

总之,这是我的工作流程,代码如下

谢谢你的建议

我正在使用的脚本,因为我正在使用前缀为它们的标记

if (  #{Content.Fields.ContactUsForm.PreferredLocation} == "North Office") { 
SetOutcome("North Office");  }
else if  (  #{Content.Fields.ContactUsForm.PreferredLocation} == "South Office") {
SetOutcome("South Office");  }

发现解决方案是在标记周围添加引号

    if (  "#{Content.Fields.ContactUsForm.PreferredLocation}" == "North Office") { SetOutcome("North Office");  }
else if  (  "#{Content.Fields.ContactUsForm.PreferredLocation}" == "South Office") { SetOutcome("South Office");  }
或者更简单:

SetOutcome("{Content.Fields.ContactUsForm.PreferredLocation}");

发现解决方案是在标记周围添加引号

    if (  "#{Content.Fields.ContactUsForm.PreferredLocation}" == "North Office") { SetOutcome("North Office");  }
else if  (  "#{Content.Fields.ContactUsForm.PreferredLocation}" == "South Office") { SetOutcome("South Office");  }
或者更简单:

SetOutcome("{Content.Fields.ContactUsForm.PreferredLocation}");

在标记周围添加引号将解决此问题。这就是为什么。。。您的代码最终将被传递到Mono.CSharp.Evaluator类并运行。但是,在此之前,标记{Content.Fields.ContactUsForm.PreferredLocation}被替换为它们的值。结果表明,这些值是字符串类型。如果不添加引号,字符串replace将把标记值直接放入代码中

此代码:

if (  "#{Content.Fields.ContactUsForm.PreferredLocation}" == "North Office") { SetOutcome("North Office");  }
else if  (  "#{Content.Fields.ContactUsForm.PreferredLocation}" == "South Office") { SetOutcome("South Office");  }
计算时将实际作为此代码执行:

 if (  "North Office" == "North Office") { SetOutcome("North Office");  }
else if  (  "North Office" == "South Office") { SetOutcome("South Office");  }
这样做的一个好处是,您可以添加任何您想要的字符串方法。ex/.ToLower、.Contains等。下面是一个这样做的示例,以帮助评估用户输入。在这种情况下有些轻率,因为数据来自下拉列表

if (  "#{Content.Fields.ContactUsForm.PreferredLocation}".ToLower() == "north office") { SetOutcome("North Office");  }
else if  (  "#{Content.Fields.ContactUsForm.PreferredLocation}".ToLower() == "south office") { SetOutcome("South Office");  }

在标记周围添加引号将解决此问题。这就是为什么。。。您的代码最终将被传递到Mono.CSharp.Evaluator类并运行。但是,在此之前,标记{Content.Fields.ContactUsForm.PreferredLocation}被替换为它们的值。结果表明,这些值是字符串类型。如果不添加引号,字符串replace将把标记值直接放入代码中

此代码:

if (  "#{Content.Fields.ContactUsForm.PreferredLocation}" == "North Office") { SetOutcome("North Office");  }
else if  (  "#{Content.Fields.ContactUsForm.PreferredLocation}" == "South Office") { SetOutcome("South Office");  }
计算时将实际作为此代码执行:

 if (  "North Office" == "North Office") { SetOutcome("North Office");  }
else if  (  "North Office" == "South Office") { SetOutcome("South Office");  }
这样做的一个好处是,您可以添加任何您想要的字符串方法。ex/.ToLower、.Contains等。下面是一个这样做的示例,以帮助评估用户输入。在这种情况下有些轻率,因为数据来自下拉列表

if (  "#{Content.Fields.ContactUsForm.PreferredLocation}".ToLower() == "north office") { SetOutcome("North Office");  }
else if  (  "#{Content.Fields.ContactUsForm.PreferredLocation}".ToLower() == "south office") { SetOutcome("South Office");  }

很抱歉没有提及这一点,但2014年3月发布的Orchard 1.8打破了C脚本代码的DecisionActivity执行。以下行:script=/{}+System.Environment.NewLine;在中,Execute方法用注释行覆盖传入的脚本变量。删除这一行,脚本将重新开始工作。很抱歉没有提及这一点,但从2014年3月开始的Orchard 1.8版本打破了C脚本代码的DecisionActivity执行。以下行:script=/{}+System.Environment.NewLine;在中,Execute方法用注释行覆盖传入的脚本变量。删除此行,脚本将重新开始工作。