cnq 发表于 2015-9-28 13:54:45

SharePoint State Machine Workflow +ASP.NET ASPX Form step by step(3)-创建Instantia

  创建一个Instantiation表单,其实和创建一个Association表单是十分相识的,我也不像在这里把代码一一的贴出来,最后我会把所有的工程一次性的贴出来的.
  在前面创建Association Form的时候,为了简化过程,我没有讲如何将Association Data传到workflow中,并在Instantiation Form中使用.
  首先,为了简化,Association表单和Instantiation表单是一样的,两个表单都是一个PeoplePicker和一个TextBox,所以用于表示两个表单数据的类是相同的,只不过为了让代码看起来更清楚点,我定义了两个类,完全一样,只不过名字是不同的.
  

Code
1   
2   public class AssociationData
3   {
4         private Contacts reviewers = default(Contacts);
5         public Contacts Reviewers
6         {
7             get
8             {
9               return this.reviewers;
10             }
11             set
12             {
13               this.reviewers = value;
14             }
15         }
16
17         private string description = default(string);
18         public string Description
19         {
20             get
21             {
22               return this.description;
23             }
24             set
25             {
26               this.description = value;
27             }
28         }
29
30         public void AddContact(string contact)
31         {
32             if (this.reviewers == null)
33             {
34               this.reviewers = new Contacts();
35             }
36             this.reviewers.AddContact(contact);
37         }
38         public string[] GetReviewers()
39         {
40             return this.reviewers.ContactList.ToArray();
41         }
42   }
43
44   
45   public class Contacts
46   {
47         private List<string> contacts;
48
49         public List<string> ContactList
50         {
51             get { return contacts; }
52             set { contacts = value; }
53         }
54         public void AddContact(string contact)
55         {
56             if (this.contacts == null)
57             {
58               this.contacts = new List<string>();
59             }
60             this.contacts.Add(contact);
61         }
62
63   }  
  因为PeoplePick是可以选择多个用户的,所以创建了一个Contact类,用来保存用户名.记得定义这些类需要加上,因为这些类会被序列化并传递给workflow实例.为此,我们也需要写两个辅助的函数,用于将我们输入的数据序列化成字符串,或是将序列化的数据反序列化成相应的对象.下面代码中的DeserializeAssoicationData函数,是将从Association表单中传递下来的序列化后的数据重新反序列化成相应的实例对象,而这些实例对象中的数据可以在Instantiation表单中被使用.serializeInstantiationFormDataToXML函数是将Instantiation表单中的数据序列化为XML字符串,传递给workflow实例,使得这些数据能够被后续的步骤中使用.
  

Code
public string serializeInstantiationFormDataToXML()
      {
            InstantiationData mydata = new InstantiationData();
            string serializedDataToReturn;

            foreach (PickerEntity pe in Reviewers.ResolvedEntities)
            {
                mydata.AddContact(pe.Key);
            }

            mydata.Description = Description.Text;
.
            using (MemoryStream stream = new MemoryStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(InstantiationData));
                serializer.Serialize(stream, mydata);
                stream.Position = 0;
                byte[] bytes = new byte;
                stream.Read(bytes, 0, bytes.Length);

                serializedDataToReturn = Encoding.UTF8.GetString(bytes);   
            }

               return serializedDataToReturn;
      }

private AssociationData DeserializeAssoicationData(string dataPassedIn)
      {
            XmlSerializer serializer = new XmlSerializer(typeof(AssociationData));
            XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(dataPassedIn));

            AssociationData deserializedAssociationFormData = (AssociationData)serializer.Deserialize(reader);

            return deserializedAssociationFormData;
      }  
  至于Instantiation表单的ASPX页面,对于我来说,是很Assocaition页面是完全一样的,除了最开始的Inherit属性不同之外,其它的完全一样.而其相应的后台代码,和Association的后台代码是十分相似的,大家到时候看看代码就明白了.
页: [1]
查看完整版本: SharePoint State Machine Workflow +ASP.NET ASPX Form step by step(3)-创建Instantia