มีเหตุให้ต้องทำ Sandboxed Workflow Action เนื่องจาก Workflow Action แบบปกติที่อยากทำดันไม่สามารถ Deploy ลงเครื่องได้เพราะไม่สามารถแก้ web.config ได้ พาลเอา Workflow Action ตัวที่เคย Deploy ได้ติดตั้งซ้ำไม่ได้ไปด้วย ลองดูตัวอย่างจาก Wictor Wilén แล้วนำมาทำตามซึ่งก็พบว่าเขาก็ไม่ได้อธิบายไปเสียทุกอย่าง ต่อไปนี้เป็นสรุปว่าจริง ๆ แล้วต้องทำอย่างไรถึงจะได้
ขั้นตอนการทำแตกต่างไปหน่อย เริ่มด้วยการสร้าง SharePoint Project แบบ Sandboxed ขึ้นมา จากนั้นสร้าง public class 1 อัน สร้าง public static method ที่มี return type เป็น System.Collections.Hashtable
มี Argument ตัวแรกเป็น Microsoft.SharePoint.UserCode.SPUserCodeWorkflowContext
เสมอ (มีหลาย Argument ได้แต่ต้องเป็น type ที่สามารถใช้กับ Workflow ได้ ตัวอย่างเช่น
public static Hashtable MyAction(SPUserCodeWorkflowContext context, string colA, string colB)
วิธีตั้งชื่อ Argument มีผลในขั้นต่อไปดังนั้นระวังเรื่องการสะกดให้ดี ส่วนเนื้อของ Method สร้าง Hashtable ขึ้นมา 1 ตัว กำหนดคีย์ที่ต้องการใช้คืนค่าออกมา (ถ้าอยากจะให้คืนค่าออกมา) จะไม่กำหนดก็ได้ ตัว context นี้จะไม่เหมือน Microsoft.SharePoint.WorkflowActions.WorkflowContext เสียทีเดียว แต่เป็นแค่ object ในนั้น ดังนั้นต้องใช้ฝีมือในการพลิกแพลงพอสมควร
ขั้นต่อมาสร้าง Module ขึ้นมา 1 อัน ในนั้นเราจะได้ elements.xml
และไฟล์ตัวอย่าง 1 อันลบไปได้เลย ส่วนใน elements.xml
สามารถลบไส้ในได้เลยเก็บไว้แค่ node Elements
สร้าง node ลูกชื่อ WorkflowActions
จากนั้นสามารถนำใส้ในจากไฟล์ .actions เดิมส่วนของ node Action
มาใช้ได้ทันที มีสิ่งที่เป็นข้อสังเกตดังนี้
- ต้องเพิ่ม attribute
SandboxedFunction="true"
ให้กับ nodeAction
- node
Action
attributeClassName
สามารถใช้ replaceable token ได้ (ต้องไปตั้ง Guid ให้กับ class ที่เราสร้างขึ้นมา) โดย Guid ที่นำมาใช้ที่นี่ต้องเขียนเป็นอักษรตัวเล็ก เช่น$SharePoint.Type.your-guid-here.FullName$
- node
Action
attributeFunctionName
เป็นชื่อของฟังก์ชั่นที่เราตั้งขึ้นมา - node
Parameters
ต้องมีลูกเป็น nodeParameter
เป็นอย่างน้อย 1 ตัว เพื่อเรียกใช้งาน context ในโค้ดของเรา - node
Parameters
หากจะทำ Parameter ให้คืนค่าออกมา (ผ่านทาง Hashtable) ให้สร้าง nodeParameter
ตั้งชื่อให้ตรงกับคีย์ที่สร้างให้กับ Hashtable (มีหลายคีย์ได้) ค่า attribute ตามนี้Type="System.String, mscorlib" Direction="Out" DesignerType="ParameterNames"
หากไม่มีไม่ต้องใส่ เพราะอาจจะเกิดปัญหา SharePoint Designer แจ้งว่ากำหนดค่าให้ตัวแปรไม่ครบได้
จากนั้นสร้าง Feature ขึ้นมากำหนดให้ Scope เป็น Site แล้วเพิ่ม Module นี้เข้าไปกับ Feature
หลังจากนี้ Build, Package แล้วนำไป Deploy ได้เลย เมื่อ Activate Solution และ Activate Site Feature เปิด SharePoint Designer ใน Site Collection ที่ติดตั้งจะพบ Workflow Action ของเราให้ใช้งานได้
MSDN.aspx "How to: Create and Deploy Workflow Actions in Sandboxed Solutions") ก็ได้เขียน How to ไว้เหมือนกัน ถ้าตกหล่นอะไรก็อ่านเพิ่มเติมจากในนี้ได้