2012年12月8日土曜日

ASP.NET MVC と WF4 を一緒に使う際に気をつけるたった一つのこと

今回は One ASP.NET Advent Calendar 2012 向けのネタです。

ASP.NET MVC も .NET 技術の一つなので、当然 Workflow Foundation 4 とも組み合わせて利用することができます。できますが、そこにはほんの少しだけ気をつけなくてはならないポイントがあったりします。


   1:  <h2>Workflow With ASP.NET MVC (でも VB)</h2>
   2:  <p>
   3:      @ViewBag.Message と設定してみた
   4:  </p>

まずは ASP.NET MVC プロジェクトを新規に作成し、Index な View をこのような感じで記載します。見出しに(でも VB)と書かれているとおり、当然私は VB 使いなので今回も VB です。VB の ASP.NET MVC でも ViewBag は使えますので、上記のように記載することだって当然可能です。

実際の所、記載して利用することは問題ないのですが今回の本題と別にここは一つ注意がありまして。

Option Strict Off  じゃないとViewBag は使えないというか書けないのですね。まぁ訓練された VB 使いにとって ViewBag などただの飾りですから気にすることは全くありません。ありませんったらありません。

それはさておき、今回はコントローラからワークフローを実行して、その戻り値を ViewBag の Message プロパティに設定する、ということをやってみます。コントローラのロジックは次のようになります。

   1:      Function Index() As ActionResult
   2:   
   3:          Dim wfPath = Server.MapPath("~/App_Data/WfWithMVC.xaml")
   4:          Dim wfFile = ActivityXamlServices.Load(wfPath)
   5:          Dim viewBagValue As New Dictionary(Of String, Object) From {{"ViewData", ViewData}}
   6:          WorkflowInvoker.Invoke(wfFile, viewBagValue)
   7:   
   8:          Return View()
   9:      End Function

ここでわざわざ ActivityXamlServices の Load メソッドでファイルを読み込ませていますが、これは今回の開発環境が Visual Web Developer 2010 Express であるので、基本として WF4 の xaml ファイルをプロジェクトに組み込んで扱うことが出来ないためです。有償版の Visual Studio であればプロジェクトに組み込むことで、普通のクラスとして扱うことができます。

ここでのポイントは 5 行目です。ここでワークフローに渡す情報=ViewData を指定しています。そろそろ勘の良い方は気づいたと思いますが、ここが気をつけるたった一つの点です・・・。細かいことは最後にして、呼び出すワークフローを。

wfmvc

今回のワークフローは Assign アクティビティ一つの非常にシンプルなものです。処理内容も受け取った ViewData に対して値を書き込んでいるだけです。

そして実行すると次のようにワークフロー上で設定した値が画面に表示されます。

wfie

このように簡単に ASP.NET MVC から WF4 を利用することができます。

では気をつけるたった一つの事とはなんだったのか。

はい、ViewBag は WF4 では扱えない、という点です。これは別に今回の私のように VB でやっているからではなく、C# で書かれても全く同様に WF4 上では ViewBag を扱うことはできません。その理由としては、WF4 では内部の処理を全て VB 式にて記載できる必要があります。ViewBag で用いられている Dynamic 型は Visual Basic ではまだ未サポートで、Object 型として扱われます。

ですので View においては ViewBag を記載しても問題なく使うことができるのですが、WF4 内部ではそれはできません。そのため ViewData を利用する必要があります。そこさえ気をつければ後は特に気にすることなく WF4 と組み合わせた開発も行えますので、是非皆さんもチャレンジしてみてください。

0 件のコメント:

コメントを投稿