2

在爲重新託管的工作流設計器編寫自定義活動時,如果我沒有必要參數,它會給我一個錯誤,即必需參數需要一個值,所以我使用如下所示的null或「ALL」。它不接受null或「ALL」或任何其他的默認參數。請注意我需要的參數是字符串類型。運行工作流時工作流基礎中自定義活動的必需參數的默認值

[RequiredArgument] 
[DefaultValue(null)] 
[Description(@"The status of the job to perform")] 
public InArgument<string> JobStatus { get; set; } 

[RequiredArgument] 
[DefaultValue("All")] 
[Description(@"The status of the job to perform")] 
public InArgument<string> JobStatus { get; set; } 

錯誤消息:

Workflow Console: Starting Workflow...

Could not start workflow.

Message: Failed to start workflow DynamicActivity.

Exception message: The following errors were encountered while processing the workflow tree: 'DynamicActivity': The private implementation of activity '1: DynamicActivity' has the following validation error: Value for a required activity argument 'JobStatus' was not supplied.

Stack trace: at System.Activities.Validation.ActivityValidationServices.ThrowIfViolationsExist(IList`1 validationErrors) at System.Activities.Hosting.WorkflowInstance.ValidateWorkflow(WorkflowInstanceExtensionManager extensionManager) at System.Activities.Hosting.WorkflowInstance.RegisterExtensionManager(WorkflowInstanceExtensionManager extensionManager) at System.Activities.WorkflowApplication.EnsureInitialized() at System.Activities.WorkflowApplication.Enqueue(InstanceOperation operation, Boolean push) at System.Activities.WorkflowApplication.WaitForTurn(InstanceOperation operation, TimeSpan timeout) at System.Activities.WorkflowApplication.InternalRun(TimeSpan timeout, Boolean isUserRun) at System.Activities.WorkflowApplication.Run()

感謝您的幫助

+0

所以你說,如果你不使用'DefaultValue'你得到一個編譯錯誤? –

+0

不,我沒有收到編譯錯誤。當我運行程序時,工作流程不會運行。我會在一分鐘後發佈錯誤消息。 – user1298925

+0

爲什麼在沒有首先驗證它的情況下執行工作流?那麼工作流設計師是不是會告訴你這些InArguments需要一個值? – Joao

回答

5

無論是工作流運行時也不流設計將考慮DefaultValueAttribute。搜索屬性需要反射,這可能會導致性能成本上升。而且這不是屬性的目的。

無論如何,您可以使用默認值初始化變量。在構造函數上,例如:

public class MyCodeActivity : CodeActivity 
{ 
    public MyCodeActivity() 
    { 
     JobStatus = "All"; 
    } 
} 

或通過訪問器強制值。像這樣:

private InArgument<string> text = "All"; 

[RequiredArgument] 
public InArgument<string> Text 
{ 
    get { return text ?? "All"; } 
    set { text = value; } 
} 

這些是不同的方法,使用適合你想要的行爲的方法。在這兩種情況下的價值總是能夠通過XAML進行修改,以便在運行時的一個小檢查可能是件好事:

protected override void Execute(CodeActivityContext context) 
{ 
    string text = context.GetValue(this.Text); 
    if (text == null) 
    { 
     text = "All"; 
    } 

    Console.WriteLine(text); 
} 
+1

另一種方法是實現'IActivityTemplateFactory',如[本示例](http://stackoverflow.com/a/3311256/1228)中所述。 – Will

+0

當然。不幸的是,這顯然是個人觀點,「IActivityTemplateFactory」是邪惡的,傾向於隱藏大部分問題而不是解決問題。除了能夠將設計體驗變成完整的噩夢。 – Joao

+0

謝謝。那麼DefaultValue的目的是什麼? – user1298925

相關問題