2012-05-29 33 views
0

我正在爲SharePoint 2010製作自定義活動。當我在SharePoint Designer中放置活動併爲參數提供值時,出現一個神祕的驗證錯誤, 「此操作需要缺少參數。」SharePoint設計器錯誤,缺少自定義活動所需的參數

下面是該操作的源代碼:

using System; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.IO; 
using System.Workflow.ComponentModel; 
using System.Workflow.Activities; 
using System.Workflow.ComponentModel.Compiler; 
using Microsoft.SharePoint; 
using Microsoft.SharePoint.WorkflowActions; 

namespace SharePoint.Activities.IO 
{ 
    public partial class CopyFile : SequenceActivity 
    { 
     public CopyFile() 
     { 
      InitializeComponent(); 
     } 

     public static DependencyProperty SourceDirectoryProperty = DependencyProperty.Register("SourceDirectory", typeof(string), typeof(CopyFile)); 
     public static DependencyProperty TargetDirectoryProperty = DependencyProperty.Register("TargetDirectory", typeof(string), typeof(CopyFile)); 
     public static DependencyProperty ActionResultProperty = DependencyProperty.Register("ActionResult", typeof(string), typeof(CopyFile)); 
     public static DependencyProperty CreateDateProperty = DependencyProperty.Register("CreateDate", typeof(DateTime), typeof(CopyFile)); 
     public static DependencyProperty CompletionDateProperty = DependencyProperty.Register("CompletionDate", typeof(DateTime), typeof(CopyFile)); 
     public static DependencyProperty WFContextProperty = DependencyProperty.Register("WFContext", typeof(WorkflowContext), typeof(CopyFile)); 

     [Description("Path the files to perform the operation on")] 
     [Browsable(true)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     [ValidationOption(ValidationOption.Required)] 
     public string SourceDirectory 
     { 
      get { return (string)GetValue(SourceDirectoryProperty); } 
      set { SetValue(SourceDirectoryProperty, value); } 
     } 
     [Description("Path the files are copied to")] 
     [Browsable(true)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     [ValidationOption(ValidationOption.Required)] 
     public string TargetDirectory 
     { 
      get { return (string)GetValue(TargetDirectoryProperty); } 
      set { SetValue(TargetDirectoryProperty, value); } 
     } 
     [Description("Once the the operation completes, this is set to OK or the exception information")] 
     [Browsable(true)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     [ValidationOption(ValidationOption.Optional)] 
     public string ActionResult 
     { 
      get { return (string)GetValue(ActionResultProperty); } 
      set { SetValue(ActionResultProperty, value); } 
     } 
     [Description("When the request was created")] 
     [Browsable(true)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     [ValidationOption(ValidationOption.Optional)] 
     public DateTime CreateDate 
     { 
      get { return (DateTime)GetValue(CreateDateProperty); } 
      set { SetValue(CreateDateProperty, value); } 
     } 
     [Description("When execution stoped")] 
     [Browsable(true)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     [ValidationOption(ValidationOption.Optional)] 
     public DateTime CompletionDate 
     { 
      get { return (DateTime)GetValue(CompletionDateProperty); } 
      set { SetValue(CompletionDateProperty, value); } 
     } 

     [Browsable(true)] 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     public WorkflowContext WFContext 
     { 
      get { return (WorkflowContext)GetValue(WFContextProperty); } 
      set { SetValue(WFContextProperty, value); } 
     } 

     //protected override void Initialize(IServiceProvider provider) 
     //{ 
     // TraceIn(); 
     // base.Initialize(provider); 
     // TraceOut(); 
     //} 

     protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) 
     { 
      TraceIn(); 

      Debugger.Break(); 

      var isSiteAdmin = false; 
      CreateDate = DateTime.Now; 
      try 
      { 
       // Needs administrative credentials to get the web application properties ino 
       SPSecurity.RunWithElevatedPrivileges(delegate 
       { 
        using (var site = new SPSite(WFContext.Site.ID)) 
        { 
         using (var web = site.AllWebs[WFContext.Web.ID]) 
         { 
          isSiteAdmin = web.CurrentUser.IsSiteAdmin; 
          if (string.IsNullOrEmpty(SourceDirectory)) throw new ArgumentException("SourceDirectory cannot be null or empty"); 
          if (!Directory.Exists(SourceDirectory)) throw new DirectoryNotFoundException("Could not find source directory: \"" + SourceDirectory + "\""); 

          if (string.IsNullOrEmpty(TargetDirectory)) throw new ArgumentException("TargetDirectory cannot be null or empty"); 
          if (!Directory.Exists(TargetDirectory)) throw new DirectoryNotFoundException("Could not find target directory: \"" + TargetDirectory + "\""); 
          // Do something 
          Debug.WriteLine(string.Format("Doing something amazing from {0} and moving it to {1}", SourceDirectory, TargetDirectory)); 
         } 
        } 
       }); 

       ActionResult = "OK"; 
      } 
      catch (Exception ex) 
      { 
       ActionResult = isSiteAdmin ? ex.ToString() : ex.Message; 
      } 
      CompletionDate = DateTime.Now; 

      var result = base.Execute(executionContext); 

      TraceOut(); 

      return result; 
     } 

     private static void TraceIn() 
     { 
      Trace("Entering"); 
     } 

     private static void TraceOut() 
     { 
      Trace("Exiting"); 
     } 

     private static void Trace(string direction) 
     { 
      Debugger.Launch(); 
      var stackTrace = new StackTrace(2, false); 
      var frame = stackTrace.GetFrame(0); 
      Debug.WriteLine(direction + " " + frame.GetMethod().Name); 
     } 
    } 
} 

這裏是.action文件。

<?xml version="1.0" encoding="utf-8" ?> 
<WorkflowInfo> 
    <Actions 
     Sequential="then" 
     Parallel="and"> 
     <Action 
      Name="IO Activities" 
      ClassName="SharePoint.Activities.IO.CopyFile" 
      Assembly="SharePoint.Activities.IO, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abfb622251cf6982" 
      Category="Custom Actions" 
      AppliesTo="all"> 
      <RuleDesigner 
       Sentence="CopyFiles from %1 to %2"> 
       <FieldBind 
        Field="SourceDirectory" 
        DesignerType="String" 
        Id="1"/> 
       <FieldBind 
        Field="TargetDirectory" 
        DesignerType="String" 
        Id="2"/> 
      </RuleDesigner> 
      <Parameters> 
       <Parameter 
        Name="SourceDirectory" 
        Type="System.String, mscorlib" 
        Direction="In" 
        DesignerType="StringBuilder" 
        Description="Directory where the source files are to move" /> 
       <Parameter 
        Name="TargetDirectory" 
        Type="System.String, mscorlib" 
        Direction="In" 
        DesignerType="StringBuilder" 
        Description="Directory where the files will be placed" /> 
       <Parameter 
        Name="ActionResult" 
        Type="System.String, mscorlib" 
        Direction="Optional" 
        DesignerType="Hide" /> 
       <Parameter 
        Name="CreateDate" 
        Type="System.DateTime, mscorlib" 
        Direction="Optional" 
        DesignerType="Hide" /> 
       <Parameter 
        Name="CompletionDate" 
        Type="System.DateTime, mscorlib" 
        Direction="Optional" 
        DesignerType="Hide" /> 

       <Parameter 
        Name="WFContext" 
        Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" 
        DesignerType="Hide" /> 
      </Parameters> 
     </Action> 
    </Actions> 
</WorkflowInfo> 

這是鏈接到my post on social.msdn.microsoft.com

感謝您的任何幫助將不勝感激。

更新:我甚至嘗試通過註釋.actions文件中的參數,類中的屬性以及註釋DependencyProperties來刪除所有參數。我仍然得到同樣的錯誤。

回答

0

最終,它看起來像這個問題(在我撕毀項目並重新開始之後)是一個不正確的設計器類型和缺失。

這裏是舊代碼:

<FieldBind Field="Result" DesignerType="TextArea" Text="Action result message; returns OK on success" Id="3" /> 

下面是正確的代碼:

<FieldBind Field="Result" DesignerType="ParameterNames" Text="Action result message; returns OK on success" Id="3" /> 

一旦做出更改,一切都似乎是工作。

相關問題