Kobarin's Development Blog

C#やASP.NET、公開APIなどについての記録です。

MultiView内のTextboxへの、検証コントロール一括処理

検証コントロールを使うパターンは、CustomControl等を除いて大体毎回同じである事が多い。

最も多いのは、

    • RequiredFieldValidatorによる必須チェック
    • RegularExpressionValidatorによる正規表現チェック

の2つ。

エラーメッセージも全て同じである上、正規表現の場合、禁則文字もほぼ同じである事が多い。

以降では、これら検証コントロールのみ設置するだけで、メッセージと規則を一括処理するコードを記す。

aspx ファイル側

  <asp:MultiView ID="mvEdit" runat="server" ActiveViewIndex="0">
    <asp:View ID="viewForm" runat="server">
      <table>
          <tr>
            <th>名称</th>
            <td>
              <asp:TextBox ID="txtName" runat="server" MaxLength="50" Width="200px" CssClass="ime-on"></asp:TextBox>
              <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtName" />
              <asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" ControlToValidate="txtName" />
            </td>
          </tr>
    ・・・

      </table>
    </asp:View>
  </asp:MultiView>

aspx.cs ファイル側

  protected void Page_Load(object sender, EventArgs e)
  {
    if (!Page.IsPostBack)
    {
      #region 検証フィールドの設定
      foreach (Control c in viewForm.Controls)
      {
        if (c is RequiredFieldValidator)
        {
          using (RequiredFieldValidator objReq = (RequiredFieldValidator)c)
            if (objReq != null) objReq.Text = "<br />必須項目です。";
        }
        else if (c is RegularExpressionValidator)
        {
          using (RegularExpressionValidator objReg = (RegularExpressionValidator)c)
            if (objReg != null) setRegularExpressionValidatorValue(objReg);
        }
      }
      #endregion
    }
  }

  protected void setRegularExpressionValidatorValue(RegularExpressionValidator objReg)
  {
    //禁則文字と文字数制限の検証
    //const string strRegFormat = "^[^\\<\\>\\&\\&quot;\';^]{0,5}$";    //正解例。サンプルなので、削除禁止。
    const string strRegMessage = "<br />{0}文字まで入力可能です。<br />また、「^」「<」「>」「&」「\"」「'」「;」は入力できません。";
    const string strRegFormat1 = "^[^\\<\\>\\&\\\"\';^]{0,";
    const string strRegFormat2 = "}$";

    //検証対象となるテキストボックス
    using (TextBox _textbox = (TextBox)viewForm.FindControl(objReg.ControlToValidate))
    {
      int numLen = 0;
      if (_textbox != null) numLen = _textbox.MaxLength;

      objReg.ValidationExpression = String.Format("{0}{1}{2}", strRegFormat1, numLen, strRegFormat2);
      objReg.Text = String.Format(strRegMessage, numLen);
    }
  }