ホーム > .NET, ASP.NET 備忘録 > EnabelDynamicDataで簡単データ検証(SqlDataSource 編)

EnabelDynamicDataで簡単データ検証(SqlDataSource 編)

DataAnnotationによるデータ検証はSqlDataSourceを使っている場合でも有効です。
この場合のサンプルを見ていきます。
例によって動作は LINQ to SQL 編と同じになりますので、動きのほうはそちらを参考に。

SqlDataSourceを使っている場合は、適当な名前(なんでもよい)のクラスを作成し、データ項目と同名のプロパティを設定していきます。
たとえばこんなクラスを作成します。

——————————————————————————————————————-

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

public class Person
{
    [Editable(false)]
    [DisplayName("ユーザID")]
    public int id { get; set; }

    [Required(ErrorMessage = "名前は必須項目です")]
    [DisplayName("名前")]
    public string name { get; set; }

    [DisplayName("年齢")]
    [Required(ErrorMessage = "年齢は必須項目です")]
    [Range(0, 120, ErrorMessage = "年齢に誤りがあります")]
    public int age { get; set; }

    [DisplayName("メールアドレス")]
    [RegularExpression(@"\w+([-+.’]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "正しいメールアドレスを入力してください")]
    public string mail { get; set; }

    [DisplayName("備考")]
    [CustomValidation(typeof(Person), "CheckMinLength")]
    public string memo { get; set; }

    public static ValidationResult CheckMinLength(string memo, ValidationContext vCont)
    {
        if (memo == null || memo.Length < 5)
            return new ValidationResult("5文字以上入力入力してください");
        return ValidationResult.Success;
    }

    public static ValidationResult CheckAge_Mail(int age, string mail)
    {
        if(age >= 20 && mail == string.Empty)
            return new ValidationResult("成人はメールアドレス必須です");
        return ValidationResult.Success;
    }
}

——————————————————————————————————————-

LinqDataSource や EntityDataSourceを利用している場合、データ項目間のチェックにはDynamicValidator に ValidationExceptionを渡すように実装すればよかったのですが、SqlDataSourceを利用している場合はDynamicValidatorが動作しません。
このため、後で述べるようにコードビハインドファイルの中でいくらか面倒な処理を記述しています。
ただ、データ項目間のチェックロジックだけでもまとめて記述したかったので、上記の CheckAge_Mail メソッドにまとめてみました。
このあたり、もっと工夫の余地がありそうにも思います。

Default.aspxは以下のようになります。

——————————————————————————————————————-

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

<html xmlns="http://www.w3.org/1999/xhtml"&gt;
<head runat="server">
    <title></title>
    <style type="text/css">
        .DDControl
        {
            color: Red;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ValidationSummary ID="ValidationSummary1" runat="server"
            CssClass="DDControl" />
        <asp:CustomValidator ID="CustomValidator1" runat="server" Display="None" />
        <asp:GridView ID="GridView1" runat="server" DataKeyNames="id"
            DataSourceID="SqlDataSource1" onrowupdating="GridView1_RowUpdating">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
            DeleteCommand="DELETE FROM [Person] WHERE [id] = @id"
            InsertCommand="INSERT INTO [Person] ([name], [age], [mail], [memo]) VALUES (@name, @age, @mail, @memo)"
            SelectCommand="SELECT * FROM [Person]"
            UpdateCommand="UPDATE [Person] SET [name] = @name, [age] = @age, [mail] = @mail, [memo] = @memo WHERE [id] = @id" >
            <DeleteParameters>
                <asp:Parameter Name="id" Type="Int32" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="name" Type="String" />
                <asp:Parameter Name="age" Type="Int32" />
                <asp:Parameter Name="mail" Type="String" />
                <asp:Parameter Name="memo" Type="String" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="name" Type="String" />
                <asp:Parameter Name="age" Type="Int32" />
                <asp:Parameter Name="mail" Type="String" />
                <asp:Parameter Name="memo" Type="String" />
                <asp:Parameter Name="id" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
    </div>
    </form>
</body>
</html>

——————————————————————————————————————-

DynamicValidatorが使えないので、CustomValidatorを使ってます。
で、Default.aspx.csは次のようになります。

——————————————————————————————————————-

using System;
using System.Web.UI;
using System.ComponentModel.DataAnnotations;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Init(object sender, EventArgs e)
    {
        GridView1.EnableDynamicData(typeof(Person));
    }
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void GridView1_RowUpdating(object sender, System.Web.UI.WebControls.GridViewUpdateEventArgs e)
    {
        int age = Convert.ToInt32(e.NewValues["age"]);
        string mail = e.NewValues["mail"] == null ? string.Empty : e.NewValues["mail"].ToString();
        ValidationResult vresult = Person.CheckAge_Mail(age, mail);
        if (vresult != ValidationResult.Success)
        {
            CustomValidator1.ErrorMessage = vresult.ErrorMessage;
            CustomValidator1.IsValid = false;
            e.Cancel = true;
        }
    }
}

——————————————————————————————————————-

EnableDynamicDataメソッドに最初に作成したクラスを渡すのが重要です。
また、GridView1_RowUpdatingでデータを更新する前にCheckAge_Mailメソッドを呼び出してエラーチェックをしています。

データの追加を行っているDefault2.aspxもほぼ同じ作りになっています。

LinqDataSource、EntityDataSource、SqlDataSourceのそれぞれの場合について書いてきましたが、当然のようにObjectDataSourceも対応していたりします。
実はMSDNのチュートリアルはObjectDataSourceでの方法が記述されています

チュートリアル:ASP.NET データバインドコントロールの動的データの有効化

このチュートリアルがあることに気づいたのは今日だったりするのですが(w
ちょうどいいのでこのチュートリアルを紹介しておきます。

カテゴリー:.NET, ASP.NET 備忘録
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。