columns で変更できるプロパティを増やす
サーバースクリプトの 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)。
共通の手順
図を読み込み中…
ServerScriptModelColumnに、値・変更フラグ・「変更されていれば値、されていなければnull」を返すGet〜()を足し、Changed()にフラグを加える。Columns()のコンストラクタ呼び出しに、サイト設定の値を初期値として渡す。ColumnにServerScriptModelColumn?.Get〜() ?? 元の値を返すGet〜()を足す。- 画面・チェックの側で、元のプロパティを直接読んでいる箇所を
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.cs | 3 プロパティの追加、コンストラクタ・Changed() の更新 |
Libraries/ServerScripts/ServerScriptUtilities.cs | Columns() で初期値を渡す |
Libraries/Settings/Column.cs | GetClientRegexValidation()・GetServerRegexValidation()・GetRegexValidationMessage() の追加 |
Libraries/HtmlParts/HtmlFields.cs | column.ClientRegexValidation を読んでいる箇所(L521・L548・L739・L769・L800・L835・L876・L908)の置き換え |
Models/Issues/IssueValidators.cs・Models/Results/ResultValidators.cs | column.ServerRegexValidation の置き換え |
Libraries/HtmlParts/HtmlComments.cs | コメント欄の正規表現の置き換え |
ほかのプロパティ
| 分類 | プロパティ | 型 | 変える箇所 | 難しさ |
|---|---|---|---|---|
| 型・文字数のチェック | ValidateNumber・ValidateDate・ValidateEmail | bool? | HtmlFields.cs(画面側だけ) | 低 |
ValidateEqualTo | string | HtmlFields.cs | 低 | |
ValidateMaxLength・MaxLength | int?・decimal? | HtmlFields.cs、サーバー側チェック | 低 | |
| 入力補助 | Description・InputGuide | string | HtmlFields.cs の Strings.CoalesceEmpty の先頭にスクリプトの値を入れる | 低 |
| 数値 | Min・Max・Step・DecimalPlaces・Unit | decimal?・int?・string | HtmlFields.cs(数値の入力欄) | 低〜中 |
| 重複禁止 | NoDuplication・MessageWhenDuplicated | bool?・string | 〜Validators.cs | 中 |
| その他 | AutoPostBack・Section・DefaultInput | HtmlFields.cs ほか | 低〜中 | |
| 書式 | GridFormat・EditorFormat・ExportFormat | 日付の入力部品と強く結びついている | 高 |
bool? のものは GetReadOnly() と同じく「変更されていれば (bool?)値、されていなければ null」を返す形にします。
画面とサーバーの両方を変える
正規表現や文字数のように画面とサーバーの両方でチェックするものは、片方だけ変えると「画面では通るのに保存でエラーになる」(またはその逆)状態になります。サーバースクリプトを動かす条件も、画面表示の前と作成前・更新前の両方にそろえる必要があります。