2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プリザンターのサーバスクリプトのcontext.Actionの値を見てみる

Posted at

はじめに

プリザンターのサーバスクリプトでどこがイベントの発火点になっているかを取得するためによく仕様される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_]*"
        }
    );
});

それぞれのpatterndefaults.Actionconstraints.Actionで定義されています。
例えば、編集画面で/items/3578784/editというURLになったとします。このパターンはName=Itemのパターンに一致するのでそれを見てみると、{controller}/{id}/{action}となっているので、{action}と一致するeditcontext.Actionになります。APIなども同じようにURLから特定することが出来ます。
ちなみにcontextで取得出来るcontext.Controllerも源泉は同じなので同じ方法で特定できます。

おまけ

実際にどのような処理をおこなわれているかは、ソースコードのImplem.Pleasanter\Controllersの中をのぞいてみてください。前述のルート定義とブラウザのデバッグコンソールで見ることのできるリクエスト・レスポンスを組み合わせてみると、自動ポストバックなどでどのURLが呼ばれているかが細かく分かるので、より細かい源泉情報を取得することが可能です。

まとめ

今回はcontex.Actionの代表的な値やそもそも何の値がセットされているかを紹介しました。contex.Actionを使いこなせると、そもそもどこから発生したイベントでサーバスクリプトが発火したか?などの発火源の特定が行えるようになるため、操作に応じた細かな条件分岐が簡単にできるようになります。URLから簡単に特定できるので、皆さんもいろいろと試してみてください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?