質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

2913閲覧

ASP.NET MVC5 TimeSpan型の例外処理を付ける

blackdifferent

総合スコア25

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2018/12/20 00:49

編集2019/01/08 01:44

こんにちわ!
度々ですが、ASP.NET MVC 5のEntity frameworkでWeb勤務表を作成しています。
ビューでの始業時間、終業時間、休憩時間の入力にはTimeSpan型を使用していますが、この入力に対し例外処理を付けたいと思っています。実装したい処理は、
①秒、分に0~59以外が入るときエラーを出す→現状だとnullがpostされる
②時に24以上が入るときエラーを出す→現状だと日(Day)に24が入りPostされる
これらの場合に、入力されたEditorを赤くし、エラーコメントを出したいと思います。
おそらく他にも例外処理が必要かと思いますが、とりあえずこの2つの処理を追加したいです。
エラー時にViewの変更を行うため、Scriptで書く必要があるのかと思いますが、どのようにしていいか分かりません。
何かアドバイスをいただけたらと思います。
以下に写真とコードを載せます。
イメージ説明

ビュー:

@model Kintai_CS_.Models.KintaiModel @{ /**/ ViewBag.Title = "勤務表"; Layout = "~/Views/Shared/_Layout.cshtml"; Dictionary<int, SelectList> dictionary = (Dictionary<int, SelectList>)ViewBag.Situation; } @using (Html.BeginForm()) { @Html.AntiForgeryToken() <header id="header" class="header"> ・・・ </header> <body id="body" class="body"> ・・・ <table class="table"> <tr> <th> <nobr>日付</nobr> </th> <th> <nobr>曜日</nobr> </th> <th style="text-align:center"> <nobr>始業時刻</nobr> </th> <th style="text-align:center"> <nobr>終業時刻</nobr> </th> <th style="text-align:center"> <nobr>休憩時間</nobr> </th> <th> <nobr>所定時間</nobr> </th> <th> <nobr>残業時間</nobr> </th> <th style="text-align:center"> <nobr>勤怠状況</nobr> </th> <th style="text-align:center"> <nobr>補助</nobr> </th> <th style="text-align:center"> <nobr>備考</nobr> </th> </tr> @for (int idx = 0; idx < Model.Kintais.Count; idx++) { <tr> @*土は青、日祝は赤にする*@ @{ string week = Model.Kintais[idx].date.ToString("ddd"); bool PublicHoliday = false; for (int i = 0; i < Model.PublicHolidays.Count; i++) { if (Model.Kintais[idx].date == Model.PublicHolidays[i].public_holiday) { <td class="red">@(idx + 1)</td> <td class="red">@week</td> PublicHoliday = true; } } if (PublicHoliday == false) { if (week == "土") { <td class="blue">@(idx + 1)</td> <td class="blue">@week</td> } else if (week == "日") { <td class="red">@(idx + 1)</td> <td class="red">@week</td> } else { <td class="black">@(idx + 1)</td> <td class="black">@week</td> } } } <td> @Html.EditorFor(model => model.Kintais[idx].open, new { htmlAttributes = new { @class = "form-control",style="text-align:center"} }) @Html.ValidationMessageFor(model => model.Kintais[idx].open, "", new { @class = "text-danger" }) </td> <td> @Html.EditorFor(model => model.Kintais[idx].close, new { htmlAttributes = new { @class = "form-control", style = "text-align:center" } }) @Html.ValidationMessageFor(model => model.Kintais[idx].close, "", new { @class = "text-danger" }) </td> <td> @Html.EditorFor(model => model.Kintais[idx].rest, new { htmlAttributes = new { @class = "form-control", style = "text-align:center" } }) @Html.ValidationMessageFor(model => model.Kintais[idx].rest, "", new { @class = "text-danger" }) </td> <td style="vertical-align:middle"> @Html.DisplayFor(model => model.Kintais[idx].worktime) @Html.HiddenFor(model => model.Kintais[idx].worktime) </td> <td style="vertical-align:middle"> @Html.DisplayFor(model => model.Kintais[idx].overtime) @Html.HiddenFor(model => model.Kintais[idx].overtime) </td> <td style="vertical-align:middle"> @Html.DropDownListFor(model => model.Kintais[idx].situation, dictionary[Model.Kintais[idx].situation], new { @class = "form-control", style = "width:130px;padding:5px" }) </td> <td style="width: 66px"> <nobr> <button type="button" onclick="setRegularWorkTime('@Html.IdFor(model => model.Kintais[idx].open)', '@Html.IdFor(model => model.Kintais[idx].close)', '@Html.IdFor(model => model.Kintais[idx].rest)')" class="btn btn-primary"> 定時 </button> </nobr> </td> <td> @Html.EditorFor(model => model.Kintais[idx].remark, new { htmlAttributes = new { @class = "form-control", style = "width:190px" } }) @Html.ValidationMessageFor(model => model.Kintais[idx].remark, "", new { @class = "text-danger" }) </td> @Html.HiddenFor(model => model.Kintais[idx].emp_num) @Html.HiddenFor(model => model.Kintais[idx].date) @Html.HiddenFor(model => model.Kintais[idx].id) </tr> } </table> </body> }

追記:
アノテーションで[Range(typeof(TimeSpan), "00:00", "23:59")]が使えそうなのですが、こちらの範囲内の数値を入力してもエラーと判定されてしまいます。どなたか分かる方がいましたら教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/25 01:38 編集

質問文を書き換えたようですが、通知が来ないので気が付きません。もし、私に答えてもらいたいという希望があれば、私の回答のコメント欄に聞きたいことを書くようにしてください。
blackdifferent

2018/12/25 02:05

すみません。 SurferOnWwwさんの回答コメント欄に記載させていただきます。
guest

回答1

0

ベストアンサー

モデルのプロパティに必要なデータアノテーション属性を付与してそれで検証するようにしてはいかがですか? ユーザー入力の検証は必須ですから ASP.NET にはそれなりの機能が用意されています。

【追伸】

前のスレッドの話から、既存の SQL Server データーベースから Visual Studio の ADO.NET Entity Framewaork の機能を使って作った EDM がベースとなっていると思いますが(そういう情報は最初の質問にきちんと書きましょうね)、その場合は一工夫必要です。詳しくは以下の記事を見てください。

EDM にデータアノテーション属性を付与
http://surferonwww.info/BlogEngine/post/2017/05/21/how-to-add-dataannotation-attributes-to-edm-generated-by-visual-studio.aspx

投稿2018/12/20 03:29

編集2018/12/20 05:40
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

blackdifferent

2018/12/20 05:45

回答ありがとうございます。 データアノテーション属性をいろいろと試していたところでした。 教えていただいたURLも含め、もう少し調べてみようと思います。
blackdifferent

2018/12/25 02:11

すみません。 追記の内容から進展がありまして、以下のアノテーション属性で一応実装が出来ました。 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh\:mm}"), DataType(System.ComponentModel.DataAnnotations.DataType.Time)] [RegularExpression(@"((([0-1][0-9])|(2[0-3]))(:[0-5][0-9])(:[0-5][0-9])?)", ErrorMessage = "00:00~23:59で入力してください")] あと終業時間を30時まで入力出来るようにしたいのですが、その場合TimeSpan型は使えなくなると思いますし、どのようにしたら実装出来るかを現在考えています。何かアドバイスがありましたらお願いします。ちなみにDBにはint型に変換(時→分)して保存しています。
退会済みユーザー

退会済みユーザー

2018/12/25 03:38

> あと終業時間を30時まで入力出来るようにしたいのですが、その場合TimeSpan型は使えなくなると思いますし、 意味が分からないのですが?
blackdifferent

2018/12/25 05:09

こちらのサイト(http://hensa40.cutegirl.jp/archives/7091)にもあるように、TimeSpan型の入力範囲が00:00~23:59なので24:00以降の時間を入力しようとするとエラーになります。なので何か良い方法がないかと思ったのですが。。。
退会済みユーザー

退会済みユーザー

2018/12/25 06:36 編集

モデルに TimeSpan 型を使ってそれにモデルバインディングしようとすると、30:00 は 1.06:00 と入力する他なさそうです。 どうしてもテキストボックスに 30:00 と入力したいということなら、モデルに String 型を使うぐらいしか思いつきません。 どうやっているのか分かりませんが DB には int 型に変換して保存するとのことですので、String 型でも変換できるのではないですか? あと、今さらながらの話ですが、[Range(typeof(TimeSpan), "00:00", "23:59")] は、クライアント側での検証を諦めて、サーバー側の検証だけにするなら使えます。
blackdifferent

2018/12/25 06:20

そうなんですね。 string型で実装出来ないかやってみようと思います。ありがとうございます。
blackdifferent

2018/12/28 01:04 編集

string型で実装できたのでクローズとします。ありがとうございました。 モデルでアノテーション属性と型を以下のように修正しました。 [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh\:mm}")] [RegularExpression(@"((([0-1][0-9])|(2[0-9]))(:[0-5][0-9])(:[0-5][0-9])?)", ErrorMessage = "00:00~29:59で入力してください")] [MaxLength(5, ErrorMessage = "00:00~23:59で入力してください")] public String Close { get; set; }
退会済みユーザー

退会済みユーザー

2018/12/28 01:41

> string型で実装できたのでクローズとします。 上のコメントのコードを拝見すると、モデルのプロパティの TimeSpan 型を string 型に変更することに決めたように見えます。 でも、質問者さんの別のスレッド https://teratail.com/questions/166215 では TimeSpan 型を使うという話に戻っていますが、どういうことですか? それから、そもそも、TimeSpan 型に代えて string 型を使ってみようという理由は、Close の方に(Open ではなく)30:00 までの入力を許容したいが TimeSpan 型ではできない(1.06:00 と入力せざるを得ない)からだったはずです。 上のコメントのコードはその話とも違うようです。最終的にどのようにすることに決めたのでしょう?
blackdifferent

2018/12/28 01:57

そうですね。 30:00までの入力のためstring型に変更したのですが、string型だとほかの入力(始業時刻、休憩時間)がTimeSpan型なので https://teratail.com/questions/166215でのアノテーション検証を付けるのは難しいのではと思いました。 またTimeSpan型のアノテーション属性でDataType.Timeを付けるとUpdownbuttonやdeletebuttonが自動で付いてくるのでユーザが使いやすいかと。 おそらくstring型でも同様の機能を付けれるかと思いますが、このプロジェクトの締め切りが迫ってきているので簡単に実装出来るほうが良いと思いました。 こちら側の都合で申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問