65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.70/5 (43投票s)

2011年2月22日

CPOL

4分钟阅读

viewsIcon

136265

downloadIcon

5307

本教程演示了如何将 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 进行页面导航

下图描绘了为波士顿经销商实现的页面导航逻辑。

Flow1.jpg

示例应用程序中的类

  1. "BostonWorkflow.xaml" 包含页面导航所需的工作流。如果您使用的是网站模型而不是 Web 应用程序,则需要将 .xaml 文件添加到类库并引用它/您可以使用 ActivityXamlServices.Load() 加载 XAML 文件。
  2. "BasePage.cs" 是一个便捷类,充当所有网页的基础页面。它有一个名为 GotoNextPage 的工作流包装方法,该方法使用必需的参数调用工作流并将浏览器重定向到所需页面。
  3. "Customer.cs" 是一个简单的客户类,用于存储客户信息和车辆信息。此类的实例被传递给工作流以做出决策。
  4. "CreditScore.cs" 用于计算申请贷款的客户的信用评分。在实际应用中,这将是一个 Web 服务调用。
  5. 在所有网页中,都使用 GotoNextPage() 方法而不是 Response.Redirect

创建页面导航工作流的步骤

步骤 1

要设计工作流,我们需要选择“添加-->新建项-->工作流-->活动”类。

第二步

必须为工作流设置参数以传递 In/Out 参数。(将工作流视为一个需要输入参数来做出决策并返回结果的参数的方法。)

在此工作流中,我设置了三个参数

ArgName 类型 方向 描述
currentPage 字符串 In 指示工作流的调用来源。
nextPage 字符串 In/Out 返回参数,用于指示下一个页面。
customer 客户 In/Out 客户对象的实例。

这些参数的作用域是整个工作流。

Argument.jpg

步骤 3

即使页面流(上图)看起来像一个连续的流程图,但每当确定下一个页面时,它都会被中断。因此,我们选择“Control flow”(控制流)来编排工作流,而不是“Flowchart”(流程图)。在 Control flow 中,我决定使用 Switch<T> 来基于 currentPage 参数切换控制。

workflow.jpg

步骤 4

在“case”内,您可以使用工具箱中控制流部分的条件(如“If Else”、“For Each”)编写业务逻辑,并且可以在条件中使用已定义的参数进行检查或赋值。

在此图表中,使用 customer 参数来检查车辆类型,并将结果赋给 nextPage。要进行结果赋值,我们需要使用原始部分中的 Assign 控件。

WorkflowHome.jpg

步骤 5

除了简单的“if/then”条件外,我们还可以在 case 语句中放入 Flowchart 控件来确定复杂的逻辑。在下图所示的示例中,如果客户的年收入低于 50000,则会检查其信用评分。为了检查信用评分,我们使用原始部分中的 InvokeMethod 控件调用 CreditScore.cs 中的外部方法。

WorkflowPayment.jpg

变量可以声明用于工作流的特定范围,就像 C# 编程一样。在此示例中,使用了名为 customerCreditScorecreditScore 的两个变量来存储值和实例。

Variable.jpg

此外,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 日:首次发布。
© . All rights reserved.