【F# + ASP.NET MVC】 アノテーション検証を行うには

◆Entity

namespace MsdnWeb.Entities

open System.Collections.Generic
open System.ComponentModel
open System.ComponentModel.DataAnnotations

type Employee() =
    let mutable id = 0
    let mutable name = ""
    let mutable age = 0

    [<DisplayName("ユーザーID")>]
    // 必須検証
    [<Required(ErrorMessage = "{0}は必須です。")>]
    // 正規表現検証
    [<RegularExpression("[0-9]{3}",
        ErrorMessage = "{0}は数字3桁で入力してください。")>]
    member x.ID
        with get() = id
        and set v = id <- v

    [<DisplayName("名前")>]
    // 文字列長検証
    [<StringLength(10,
        ErrorMessage ="{0}は{1}文字以内で入力してください。")>]
    member x.Name
        with get() = name
        and set v = name <- v

    [<DisplayName("年齢")>]
    // 値範囲検証
    [<Range(20, 60,
        ErrorMessage="{0}は{1}~{2}の間で入力してください。")>]
    member x.Age
        with get() = age
        and set v = age <- v

◆Controller

namespace MsdnWeb.Controllers

open System.Web
open System.Web.Mvc

open MsdnWeb.Models
open MsdnWeb.Entities

type HomeController() =
    inherit Controller()

    member this.Index() =
        this.View() :> ActionResult

    [<HttpPost>]
    member this.Index(entity:Employee) =
        // 検証結果を判定
        if this.ModelState.IsValid then
            this.ViewData.["Message"] <- "検証OK"
        else
            this.ViewData.["Message"] <- "検証NG"

        this.View(entity) :> ActionResult

◆View(項目ごとに個別検証)

@model MsdnWeb.Entities.Employee
           
@{ Layout = null; }

<!DOCTYPE html>
<html>
<head>
    <title>F# + ASP.NET MVC</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" 
        type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" 
        type="text/javascript"></script>
    <!-- クライアントサイド検証を有効に設定-->
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
        type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
        type="text/javascript"></script>
</head>
<body>
    <div>
        @using (Html.BeginForm()) { 
            @Html.ValidationSummary(true)
            <fieldset>
                <legend>User</legend>
                <div class="editor-label">
                    @Html.LabelFor(model => model.ID)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.ID)
                    @Html.ValidationMessageFor(model => model.ID)
                </div>
                <div class="editor-label">
                    @Html.LabelFor(model => model.Name)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Name)
                    @Html.ValidationMessageFor(model => model.Name)
                </div>
                <div class="editor-label">
                    @Html.LabelFor(model => model.Age)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Age)
                    @Html.ValidationMessageFor(model => model.Age)
                </div>
                <p>
                    <input type="submit" value="Create" />
                </p>
            </fieldset>
        }
    </div>
</body>
</html>

◆View(項目をまとめて検証)

@model MsdnWeb.Entities.Employee
           
@{ Layout = null; }

<!DOCTYPE html>

<html>
<head>
    <title>F# + Entity Framework</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" 
        type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" 
        type="text/javascript"></script>
    <!-- クライアントサイド検証を有効に設定-->
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
        type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
        type="text/javascript"></script>
</head>
<body>
    <div>
        @using (Html.BeginForm()) { 
            @Html.ValidationSummary(false)
            <fieldset>
                <legend>User</legend>
                <div class="editor-label">
                    @Html.LabelFor(model => model.ID)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.ID)
                    @Html.ValidationMessageFor(model => model.ID, "*")
                </div>
                <div class="editor-label">
                    @Html.LabelFor(model => model.Name)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Name)
                    @Html.ValidationMessageFor(model => model.Name, "*")
                </div>
                <div class="editor-label">
                    @Html.LabelFor(model => model.Age)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Age)
                    @Html.ValidationMessageFor(model => model.Age, "*")
                </div>
                <p>
                    <input type="submit" value="Validate" />
                </p>
            </fieldset>
        }
    </div>
</body>
</html>

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中