Skip to content

columns で変更できるプロパティを増やす ​

第1版作成 最終更新 (日本時間)
確認バージョン1.5.8.1

サーバースクリプトの columns.項目名 で変更できるのは、1.5.8.1 ではラベル・読み取り専用・非表示・必須・CSS・前後の HTML・選択肢だけです(一覧は columns で変更できるプロパティ)。このページは、正規表現チェックなどもスクリプトで条件によって切り替えられるようにする本体改修の設計メモで、本体の標準機能ではありません。

前提にした現行実装 ​

ReadOnly・Hide・ValidateRequired は次の 4 か所の組み合わせで実現されています。新しいプロパティも同じ形で足せます。

役割1.5.8.1 の実装
スクリプトの値と変更フラグを持つServerScriptModelColumn の backing field・_xxxChanged・Changed()・GetReadOnly() など(ServerScriptModel.cs#L192-L335)
初期値を渡すServerScriptUtilities.Columns() でサイト設定の値をコンストラクタに渡す(ServerScriptUtilities.cs#L645-L678)
スクリプトの値を優先して返すColumn.GetReadOnly()・GetHide()・GetValidateRequired()(Column.cs#L971-L1010)
使う側HtmlFields.cs(画面)、IssueValidators.cs・ResultValidators.cs(サーバー側チェック)が Get〜() を呼ぶ

一方、正規表現チェックは画面もサーバー側も column.ClientRegexValidation・column.ServerRegexValidation を直接読んでいます(HtmlFields.cs#L521、IssueValidators.cs#L1363)。説明文・入力ガイドも column.Description・column.InputGuide を直接使っています(HtmlFields.cs#L151-L173)。

共通の手順 ​

図を読み込み中…

  1. ServerScriptModelColumn に、値・変更フラグ・「変更されていれば値、されていなければ null」を返す Get〜() を足し、Changed() にフラグを加える。
  2. Columns() のコンストラクタ呼び出しに、サイト設定の値を初期値として渡す。
  3. Column に ServerScriptModelColumn?.Get〜() ?? 元の値 を返す Get〜() を足す。
  4. 画面・チェックの側で、元のプロパティを直接読んでいる箇所を Get〜() に置き換える。

例: 正規表現チェック ​

もっとも要望が多いと考えられる例です。クライアント側(画面の data 属性)とサーバー側の両方を変えます。

csharp
private string _clientRegexValidation;
private bool _clientRegexValidationChanged;
public string ClientRegexValidation
{
    get { return _clientRegexValidation; }
    set { _clientRegexValidation = value; _clientRegexValidationChanged = true; }
}
public string GetClientRegexValidation()
{
    return _clientRegexValidationChanged ? _clientRegexValidation : null;
}
// ServerRegexValidation・RegexValidationMessage も同じ形
csharp
public string GetClientRegexValidation()
{
    return ServerScriptModelColumn?.GetClientRegexValidation()
        ?? ClientRegexValidation;
}
csharp
// HtmlFields.cs
validateRegex: column.GetClientRegexValidation(),
validateRegexErrorMessage: column.GetRegexValidationMessage(),
// IssueValidators.cs / ResultValidators.cs
serverRegexValidation: column.GetServerRegexValidation(),
regexValidationMessage: column.GetRegexValidationMessage(),

改修後のスクリプトの例です。

js
// 画面表示の前・作成前・更新前: 国が JP のときだけ郵便番号の形式をチェックする
if (model.ClassA === 'JP') {
    columns.ClassB.ClientRegexValidation = '^\\d{3}-\\d{4}$';
    columns.ClassB.ServerRegexValidation = '^\\d{3}-\\d{4}$';
    columns.ClassB.RegexValidationMessage = '郵便番号は 000-0000 の形式で入力してください';
}
ファイル変更
Libraries/ServerScripts/ServerScriptModel.cs3 プロパティの追加、コンストラクタ・Changed() の更新
Libraries/ServerScripts/ServerScriptUtilities.csColumns() で初期値を渡す
Libraries/Settings/Column.csGetClientRegexValidation()・GetServerRegexValidation()・GetRegexValidationMessage() の追加
Libraries/HtmlParts/HtmlFields.cscolumn.ClientRegexValidation を読んでいる箇所(L521・L548・L739・L769・L800・L835・L876・L908)の置き換え
Models/Issues/IssueValidators.cs・Models/Results/ResultValidators.cscolumn.ServerRegexValidation の置き換え
Libraries/HtmlParts/HtmlComments.csコメント欄の正規表現の置き換え

ほかのプロパティ ​

分類プロパティ型変える箇所難しさ
型・文字数のチェックValidateNumber・ValidateDate・ValidateEmailbool?HtmlFields.cs(画面側だけ)低
ValidateEqualTostringHtmlFields.cs低
ValidateMaxLength・MaxLengthint?・decimal?HtmlFields.cs、サーバー側チェック低
入力補助Description・InputGuidestringHtmlFields.cs の Strings.CoalesceEmpty の先頭にスクリプトの値を入れる低
数値Min・Max・Step・DecimalPlaces・Unitdecimal?・int?・stringHtmlFields.cs(数値の入力欄)低〜中
重複禁止NoDuplication・MessageWhenDuplicatedbool?・string〜Validators.cs中
その他AutoPostBack・Section・DefaultInputHtmlFields.cs ほか低〜中
書式GridFormat・EditorFormat・ExportFormat日付の入力部品と強く結びついている高

bool? のものは GetReadOnly() と同じく「変更されていれば (bool?)値、されていなければ null」を返す形にします。

画面とサーバーの両方を変える

正規表現や文字数のように画面とサーバーの両方でチェックするものは、片方だけ変えると「画面では通るのに保存でエラーになる」(またはその逆)状態になります。サーバースクリプトを動かす条件も、画面表示の前と作成前・更新前の両方にそろえる必要があります。

関連ページ ​

変更履歴

第1版サーバースクリプトの仕組み・項目の変更可否・拡張サーバースクリプトの解説と、関連する改修・設計メモを追加