ASP.NET 使用 Workflow 4.0 进行页面导航






4.70/5 (43投票s)
本教程演示了如何将 Workflow 4.0 用于 ASP.NET 的页面导航。
引言
在本文中,我将解释如何使用 Workflow 4.0 来控制 ASP.NET 中的页面导航。如果您是 Workflow 4.0 的新手,请参阅 MSDN 文档以了解其工作原理,因为本文的范围仅限于工作流创建。
背景
本示例使用的技术:.NET 4.0、Visual Studio 2010、Workflow 4(.NET 4 Framework 的一部分)、ASP.NET Web 应用程序。
目标:从 .aspx 页面中移除页面导航逻辑,并将其集中到一个工作流模块中。
示例:为销售汽车和摩托车的波士顿经销商实现了页面导航。 请下载附带的示例应用程序以完整理解本文。
使用 Workflow 4.0 进行页面导航
下图描绘了为波士顿经销商实现的页面导航逻辑。
示例应用程序中的类
- "BostonWorkflow.xaml" 包含页面导航所需的工作流。如果您使用的是网站模型而不是 Web 应用程序,则需要将 .xaml 文件添加到类库并引用它/您可以使用
ActivityXamlServices.Load()
加载 XAML 文件。 - "BasePage.cs" 是一个便捷类,充当所有网页的基础页面。它有一个名为
GotoNextPage
的工作流包装方法,该方法使用必需的参数调用工作流并将浏览器重定向到所需页面。 - "Customer.cs" 是一个简单的客户类,用于存储客户信息和车辆信息。此类的实例被传递给工作流以做出决策。
- "CreditScore.cs" 用于计算申请贷款的客户的信用评分。在实际应用中,这将是一个 Web 服务调用。
- 在所有网页中,都使用
GotoNextPage()
方法而不是Response.Redirect
。
创建页面导航工作流的步骤
步骤 1
要设计工作流,我们需要选择“添加-->新建项-->工作流-->活动”类。
第二步
必须为工作流设置参数以传递 In
/Out
参数。(将工作流视为一个需要输入参数来做出决策并返回结果的参数的方法。)
在此工作流中,我设置了三个参数
ArgName | 类型 | 方向 | 描述 |
currentPage |
字符串 |
In |
指示工作流的调用来源。 |
nextPage |
字符串 |
In /Out |
返回参数,用于指示下一个页面。 |
customer |
客户 |
In /Out |
客户对象的实例。 |
这些参数的作用域是整个工作流。
步骤 3
即使页面流(上图)看起来像一个连续的流程图,但每当确定下一个页面时,它都会被中断。因此,我们选择“Control flow”(控制流)来编排工作流,而不是“Flowchart”(流程图)。在 Control flow 中,我决定使用 Switch<T>
来基于 currentPage
参数切换控制。
步骤 4
在“case
”内,您可以使用工具箱中控制流部分的条件(如“If Else
”、“For Each
”)编写业务逻辑,并且可以在条件中使用已定义的参数进行检查或赋值。
在此图表中,使用 customer
参数来检查车辆类型,并将结果赋给 nextPage
。要进行结果赋值,我们需要使用原始部分中的 Assign
控件。
步骤 5
除了简单的“if
/then
”条件外,我们还可以在 case
语句中放入 Flowchart
控件来确定复杂的逻辑。在下图所示的示例中,如果客户的年收入低于 50000,则会检查其信用评分。为了检查信用评分,我们使用原始部分中的 InvokeMethod
控件调用 CreditScore.cs 中的外部方法。
变量可以声明用于工作流的特定范围,就像 C# 编程一样。在此示例中,使用了名为 customerCreditScore
和 creditScore
的两个变量来存储值和实例。
此外,customer.Interest
值是基于 BL 设置的,并在 Delivery.aspx 中显示。
步骤 6
现在必须将工作流连接到 ASPX 页面。在此示例中,我创建了一个名为 BasePage
的类,该类调用工作流类并传递必需的参数。
WorkflowInvoker.Invoke
使用我们在编排工作流时定义的参数来调用工作流。
WorkflowInvoker.Invoke(new BostonWorkflow(), wfParams);
参数(In
/Out
)必须作为 Dictionary
对象传递。
IDictionary<string, object> wfParams = new Dictionary<string, object>();
wfParams.Add("currentPage", Request.FilePath.Substring(1, Request.FilePath.Length - 1));
wfParams.Add("customer", customer);
返回值 nextPage
将在工作流中创建并添加到 Dictionary
。使用此值,我们可以将应用程序重定向到所需的页面。
Response.Redirect(wfParams["nextPage"].ToString());
BasePage.cs
public void GotoNextPage()
{
IDictionary<string, object> wfParams = new Dictionary<string, object>();
wfParams.Add("currentPage", Request.FilePath.Substring
(1, Request.FilePath.Length - 1));
wfParams.Add("customer", customer);
wfParams = WorkflowInvoker.Invoke(new BostonWorkflow(), wfParams);
Response.Redirect(wfParams["nextPage"].ToString());
}
对于所有实现 BasePage
的网页,调用 GotoNextPage
即可完成重定向工作。通过这样做,我们消除了页面中的导航逻辑,并将其集中到了工作流中。
HomePage.aspx.cs
protected void btnNext_Click(object sender, EventArgs e)
{
customer.vehicle.VehicleType = RadioButtonList1.SelectedValue;
GotoNextPage();
}
结论
感谢您阅读本文。请下载附件示例并亲自尝试。
历史
- 2011 年 2 月 21 日:首次发布。