はじめに
プリザンターのサーバスクリプトでどこがイベントの発火点になっているかを取得するためによく仕様されるcontext.Action
、マニュアルにセットされる値が記載されていないために何がどの条件でというのがわかりにくい所があります。今回は代表的な値を紹介してみます。
代表的なcontext.Action
Action | 説明 |
---|---|
analy | 分析チャート画面 |
burndown | バーンダウンチャート画面 |
calendar | カレンダー画面 |
copy | コピーがおこなわれたとき |
copyrow | 一覧画面編集で行をコピーしたとき |
crosstab | クロス集計画面 |
delete | 削除がおこなわれたとき |
deletecomment | コメントが削除されたとき |
deletehistory | 履歴が削除されたとき |
edit | 編集画面 |
export | エクスポートされたとき |
gantt | ガントチャート画面 |
gridrows | 一覧画面で追加行が読み込まれたとき |
histories | 履歴一覧画面 |
history | 履歴画面 |
imagelib | 画像ライブラリ画面 |
import | インポートされたとき |
index | 一覧画面 |
kamban | カンバン画面 |
login | ログイン画面 |
new | 新規作成 |
newongrid | 一覧画面編集で新規行を追加した時 |
timeseries | 時系列チャート画面 |
trashbox | ゴミ箱画面 |
update | 更新処理が実施されたとき |
源泉はどこ?
コードではcontext.Action
への値のセットは次でおこなわれています。
Action = RouteData.Get("action")?.ToLower() ?? string.Empty;
データの取得に使用したURLからaction
に相当する部分を抽出しています。
では、URL=ルート情報の定義はどうなっているかというと次の部分で定義されています。
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
if (Parameters.Security.HealthCheck.Enabled)
{
if (Parameters.Security.HealthCheck.EnableDetailedResponse)
{
endpoints
.MapHealthChecks("/healthz", new HealthCheckOptions()
{
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse,
})
.RequireHost(Parameters.Security.HealthCheck.RequireHosts ?? Array.Empty<string>());
}
else
{
endpoints
.MapHealthChecks("/healthz")
.RequireHost(Parameters.Security.HealthCheck.RequireHosts ?? Array.Empty<string>());
}
}
endpoints.MapControllerRoute(
name: "Default",
pattern: "{controller}/{action}",
defaults: new
{
Controller = "Items",
Action = "Index"
},
constraints: new
{
Controller = "[A-Za-z][A-Za-z0-9_]*",
Action = "[A-Za-z][A-Za-z0-9_]*"
}
);
endpoints.MapControllerRoute(
name: "Others",
pattern: "{reference}/{id}/{controller}/{action}",
defaults: new
{
Action = "Index"
},
constraints: new
{
Reference = "[A-Za-z][A-Za-z0-9_]*",
Id = "[0-9]+",
Controller = "Binaries|PublishBinaries|OutgoingMails",
Action = "[A-Za-z][A-Za-z0-9_]*"
}
);
endpoints.MapControllerRoute(
name: "Item",
pattern: "{controller}/{id}/{action}",
defaults: new
{
Controller = "Items",
Action = "Edit"
},
constraints: new
{
Id = "[0-9]+",
Action = "[A-Za-z][A-Za-z0-9_]*"
}
);
endpoints.MapControllerRoute(
name: "Binaries",
pattern: "{controller}/{guid}/{action}",
defaults: new
{
Controller = "Binaries"
},
constraints: new
{
Guid = "[A-Za-z0-9]+",
Action = "[A-Za-z][A-Za-z0-9_]*"
}
);
endpoints.MapControllerRoute(
name: "BinariesUpload",
pattern: "binaries/upload",
defaults: new
{
Controller = "Binaries",
Action = "Upload"
},
constraints: new
{
Guid = "[A-Za-z0-9]+",
Action = "[A-Za-z][A-Za-z0-9_]*"
}
);
});
それぞれのpattern
とdefaults.Action
、constraints.Action
で定義されています。
例えば、編集画面で/items/3578784/edit
というURLになったとします。このパターンはName=Item
のパターンに一致するのでそれを見てみると、{controller}/{id}/{action}
となっているので、{action}
と一致するedit
がcontext.Action
になります。APIなども同じようにURLから特定することが出来ます。
ちなみにcontext
で取得出来るcontext.Controller
も源泉は同じなので同じ方法で特定できます。
おまけ
実際にどのような処理をおこなわれているかは、ソースコードのImplem.Pleasanter\Controllers
の中をのぞいてみてください。前述のルート定義とブラウザのデバッグコンソールで見ることのできるリクエスト・レスポンスを組み合わせてみると、自動ポストバックなどでどのURLが呼ばれているかが細かく分かるので、より細かい源泉情報を取得することが可能です。
まとめ
今回はcontex.Action
の代表的な値やそもそも何の値がセットされているかを紹介しました。contex.Action
を使いこなせると、そもそもどこから発生したイベントでサーバスクリプトが発火したか?などの発火源の特定が行えるようになるため、操作に応じた細かな条件分岐が簡単にできるようになります。URLから簡単に特定できるので、皆さんもいろいろと試してみてください。