簿記 私が使用している電卓

簿記で使用する電卓は何がいいか?迷いますよね。
私もネットで検索して、いろいろ迷いました。

今日は実際に私が使用した電卓と、その使い心地などを紹介します。

まず1代目
カシオ DF-120GT-N Amazon価格:2,172円
カシオ スタンダード電卓 時間・税計算 デスクタイプ 12桁



この電卓で簿記3級の試験と簿記2級の試験を受けました。
この電卓の良いところは角度調整ができるところです。
キー音はカチカチとちょっと軽いです。
特にめだって良いところも、悪いところもありません。
簿記3級なら十分です。
簿記2級でももちろん使えますが、下記の2代目の電卓のほうがお勧めです。


次は2代目
CASIO DS-20DB-N Amazon価格:7,028円
カシオ 本格実務電卓 日数&時間・税計算 デスクタイプ 12桁



高いです!
簿記1級の勉強を始めるときに買いました。
1代目がCASIOだったので、2代目もCASIOから選びました。
高いだけあって、やっぱりいいです。
簿記2級の時に買えば良かったと思いました。

この電卓の良いところ
・早打ち対応
・日数計算
・大きさ(A5サイズで大きい!でも打ちやすい)
・操作時のすべりを抑える大型ストッパーが本体裏面に付いている

早打ち対応は必須です。
簿記2級、簿記1級と進んでいくと、電卓操作も早くなっていきます。
パチパチパチとブラインドタッチで連打してちゃんとキー入力を認識してくれないとストレスたまります。

日数計算も私には必須です。
私は日数や月数の計算が大の苦手です。
固定資産の償却や、満期目的有価証券の償却が出てくるだけで、もうウンザリかつゲンナリでした。
でも頻出論点なので2級でもほぼ出題されるんじゃないでしょうか。
日数計算機能があると本当に楽です。
日数計算機能の便利さをしっていたなら、簿記2級の試験前に買っていたと思います。
今ではもう手放せないです。

大きさはA5サイズと大きいです。
でもこの大きさが打ちやすいと思っています。
私は初代の電卓は右手打ちでした。
簿記2級の勉強中に左手打ちを練習したのですが、どうしても左手打ちをマスターできませんでした。
でもこの電卓に変えてから、すんなり左手打ちに移行できました。

キー音はカチカチならず適度な押した感があり快適です。
すべり止のストッパーもぴったりとくっついてまったく動きません。


悪い点もあります。
・角度調整ができないため、光の角度で反射して見にくいときがあります。
・操作時のすべりを抑える大型ストッパーが本体裏面に付いているんですが、まったく動かな過ぎて困る。

反射して見えないという状況はそんなにはないのですが、場所を選べない場合など、ときどき反射で見えないことがあります。
角度調整ができたら本当にいいのになぁと思います。

そして一番困るのは滑り止めです。
まったく動かないです!
机の上に電卓をポンと置いて、垂直に電卓を持ち上げると、机まで持ち上がりそうなほどくっついています。
何も意識せずに電卓を動かそうとすると、爪がはがれるかというほどの衝撃を受けます。
女性でネイルや付け爪していると外れるかもしれません。


ツールに頼らないで試験に挑むのもいいですが、
予算が許すなら快適なツールを手にするとモチベーションも効率も格段にアップしますよ。
ちなみに私はツールにはこだわるタイプで、予算が許す限り道具から揃えるタイプです(笑)

以上、たった2台ですが、私が過去使用した電卓と、現在使用している電卓の紹介でした。


簿記 簿記の試験で知っているとチョットいいこと

今日は簿記の試験で知っているとチョットいいことを紹介します。
私も簿記2級の試験直前に知ったのですが、もっと早く知っておきたかったです。


みなさん簿記の試験を受ける直前は、過去問題を制限時間内に解答できるか練習すると思います。
その時、計算用紙はどうしていますか?

実際の試験では問題用紙とは別に白紙のA4用紙が1枚配られます。
私は簿記2級の過去問を解くとき、計算用紙はA4白紙1枚と決めて、制限時間内に解けるか練習していました。
ネットで調べると、この計算用紙を縦に折り目を入れて仕訳を書くとよいとか、いろいろ使い方が紹介されています。
私の場合
それ以前に計算用紙がA4用紙1枚じゃ足りません。
過去問を解く際は自分にあった計算用紙の使い方も考えようとしていたのですけど、それ以前の問題でした。

でもこの計算用紙、実際の試験では、なんとA4 1.5枚~2枚にできるんです!!


問題用紙が配られると、まず白紙のA4用紙が1枚配られます。
そして問題用紙の裏表紙が白紙なんです。
これでA4の片面分の計算用紙ができます。
試験の回によっては、裏表紙の裏面も白紙の場合があります。

でも確実にA4用紙1.5枚分の計算用紙ができます。

私の場合ですが、試験が始まっったらすぐに問題用紙のホッチキス止めを外し、問題用紙をばらしました。
こんな感じです。


この回は裏表紙の裏面が白紙だったので、問題1以外の計算用紙に使えました。
計算用紙がA4用紙1枚では足りない方は、お試してみてください。

簿記 試験会場での注意

今日は簿記の試験会場について書いてみようと思います。

私の場合、試験会場は地元の商工会議所でした。
3級は6月14日、2級は11月20日に受けました。

6月に3級の試験を受けたときは、とても暑い日でした。
服装はジーパン+Tシャツ+サンダルだったと思います。
試験会場はクーラーガンガンで激寒でした!!
靴下を履いていない足はキンキンに冷え、試験直前にトイレに行ったはずなのに、試験の最後までトイレ我慢するのが大変でしたw
女性はカーディガンを持って行きましょう。
靴下は履いていきましょうw

11月に2級の試験を受けたときは、少し肌寒い日だったと思います。
前回の教訓から暖房が効いて暑かったら大変だなと、軽く薄着で行ったと思います。
試験会場はうっすら暖房が効いた感じで寒かったw

少し寒いぐらいのほうが、頭は冴えるのでよかったですが
服装は調節できる服を着ていきましょうね~


テスト開始時間が来ると、お姉さんがマイクでテストの説明を始めます。
説明が一通り終わるとテスト開始です。

テストが開始されると、一斉に電卓を叩く音が聞こえだして焦る焦るっ
そんなバチバチ叩かなくてもいいでしょってぐらい、バチバチダダダダンって感じです。
何周りを威圧してるんだよ~って思いました。

少しすると周りがページをめくる音が聞こえてきます。
えぇ私まだ1枚目の途中なんですけど~ってまた焦るんですね。

鉛筆でカリカリ書く音、電卓を叩く音、紙をめくる音、
焦ってる人がいるのか、結構乱暴に音を立てる人がいます。
つられて焦らないように、冷静に!

そして数十分たつ頃、退出する人がではじめます。
いつも不思議なんですが、テストが開始されて30分も立たないうちに退出するって何なんでしょうか?
2級でも3級でも二人ほどいたんですが、2級の全問題を30分で解けたんでしょうか?
問題を入手するためでしょうか?
それとも試験を受ける気がないのでしょうか?
どちらにしろ、気になってしまって「もう終わったの!?」と焦ります。


試験を受ける回にもよると思うのですが
当日は時間が足らなくなると思っていたので、見直し時間は取らずに、1問づつ丁寧に解いていました。
(どうせ見直しても間違いに気づかいないし・・・)
でも、時間が余ってしまって全問題もう1回解くぐらいの余裕はありました。
優しい問題の回だったのかもしれません。
でもそんなに時間が足らないということはありませんでした。


試験会場で注意することは
1、周りにつられて焦らない。
2、衣服のチョイスは慎重に。


次回は実際の試験で知っておくとチョットお得なことを書こうと思います。

簿記の勉強方法

簿記2級の勉強から使っている消しゴムです。
右は新品。
左は現在。 人生で初めて消しゴムを無くす事なく、最後まで使い切ったw

私の愛用の消しゴムは「サクラクレパスのArch」
この消しゴムの前は「トンボ鉛筆のMono」を使ってました。
Monoは柔らかめで最後小さくなった時にポロポロ欠けてしまうんですよね~。
ArchはMonoに比べて固めで、小さくなった時もポロポロ欠けません。
消し心地もわるくなく、しっかり消えるので(私は筆圧弱めです)リピート買いしてます。

私が簿記3級からの現在勉強中の簿記1級まで実際に行っている勉強方法を紹介します。

まずは通勤電車内で簿記のテキストを1冊分をサラサラ~と読みます。
理解できなくてもいいです。ただ流し読みします。
途中寝たり意識朦朧としたりするので、通勤電車でもう1回サラサラ~と最後まで読みます。
テキストのボリュームや大きな流れをつかむ感じです。

次にテキストの理解を開始します。
通勤電車内で1章分を理解できるまで読みます。
自宅に戻ったら空いた時間でテキストの例題を解いたり、テキスト章末の問題を解いて理解を深めます。
同時に問題集の問題も解きます。
回答用紙はあらかじめダウンロードして印刷しておき、回答用紙に書いたら答え合わせをした後、消しゴムで消しておきます。
このとき問題集の問題は解けなくてOKです。
テキストだけでは理解できない部分を補う程度です。
問題集にはページの上の方に解いた日とチェック(レ点)を入れておきます。

次はノートにまとめます。
私は「書いて覚える」派で、書けば覚えられるのですが、書かないと覚えられません。
ここまで例題を解いたり問題を解いたりして要点はわかっているはずなので、自分のわかるようにノートにまとめていきます。
これが時間かかるんですよね(;^ω^)

次に該当する章の問題集の問題をもう1回解きます。
問題を解いたらページの先頭に日付と下記のマークをつけておきます。
〇:楽々解けた
〇ㇾ(〇の中にチェック):解けたけどまだ怪しい
△:間違えたけど理解できてる
×:全然だめ

1章進んだら、次は復習期間に入ります。
問題集の先頭から進めて行き、
×がついている問題は前回の日付以降3日ぐらいあけて(あまり期間を空けすぎないようにして)解きます。
△がついている問題も5~7日ぐらいあけて解くようにします。
〇とチェックがついている問題は7~10日以上あけて解くようにします。
〇がついている問題も10日以上あけて解くようにします。

〇が2回連続で続いているものは、1か月後ぐらいに解いてみて、余裕なら◎にしておきます。
以降は◎の問題は(基本)解きません。
3か月後、6か月後にランダムで解いたりはします。

簡単な問題でも最低3回は解きます。
難しくて何回も間違える問題なら7回ぐらい解いたりします。
そのたびに回答用紙にカキカキして、ケシケシするので、消しゴムが減るんですね。

ポイントは
・テキストと同時に1回
・3日ぐらいあけてもう1回
・7日~10日あけてもう1回
・1カ月、3カ月、6カ月という感じで忘却曲線を意識して復習していきます。

復習が終われば、またテキストにもどって章を進めます。
復習の隙間で章を進めて行く感じですね。

どんどん忘れて行ってしまうので、忘れても気にせず覚えなおす。
そのうち覚えます。


私は資格をとる事が目的ではなく、しっかり理解することを目的としています。
なので人より時間がかかってもかまわないと思っています。
仕事がIT関係なので、お客様とお話ししたとき「簿記1級持ってるならコレわかるよね?」とパッと聞かれて答えられる人を目指してます。

資格を取るだけなら、もっと効率よい方法があると思います。
テキストを読まずに問題集を解いてからテキストを読むといった方法もあります。
一番いいのは自分にあった勉強方法ですので、いろんな人を参考に自分にあった方法を見つけてくださいね~!

簿記を勉強したきっかけ

2016年12月28日に最後の投稿してから、約1年半ぶりの投稿です。
最近は簿記の勉強でまったく時間がなく、投稿できませんでした。

そもそもなぜ簿記を簿記を勉強しているのかというと・・・

2014年まではフリーで在宅のプログラム開発の仕事をしていました。
2015年は近所のパッケージ開発会社で短時間契約社員をしていました。
2016年からは自社でシステム受託開発している小さな会社の正社員に転職しました。

2016年で40歳になる私。
かねてから、40歳になったらどこかで正社員で転職して定年まで細く長く(惰性で)働こうと考えていました(;^ω^)
子供も4歳。
ちょっと手も離れてよいお年頃なので、この年齢で正社員で客先常駐じゃない会社に就職できてほんと幸運です。
(社員数も少ないし先行き不透明ですけど、フリーよりは安定しているし精神的に楽です。)

正直なところ苦戦すると思っていた転職活動も、5社ぐらい受けたところで決まりました。
そもそも特定派遣していないIT会社を探しても10社もなかったです。

どこの面接でもかなり評価がよかったのが簿記の資格でした。
しかも簿記3級です(笑)
(簿記2級を勉強中ですとはアピールしました)

2015年に働いていたパッケージ開発の会社は、建築会計ソフトを開発している会社でした。
簿記が苦手で借方も貸方もわからなかったので、プログラムは組めるけど仕様が理解できませんでした。
簿記3級を取得しようとネットで調べると、簿記3級は3カ月あれば余裕で取れるとあったので、とりあえず簿記3級の勉強をはじめることにしました。
勉強を始めたのはいいものの、育児と家事と仕事でなかなか勉強時間が取れない上に、簿記は苦手という意識がなかな拭えず、3級はほんとに苦戦しました。
(今は簿記1級の勉強中ですが、3級が一番しんどかった!)

簿記3級の勉強時間は
平日は細切れ時間で通勤時間中もいれて1日30分ぐらいが精一杯。
土日祝の休みの日は早起きして1時間くらい。
基礎が大事だと思っているので、資格を取ることが目的ではなく、しっかり理解することを目的に6カ月かかりました。
2015年6月14日 140回の簿記3級に合格しました。

さぁ簿記3級とったぞ!
仕様も理解できるハズ!!
…あれっ?
わからない…?えっ?
簿記3級があれば少しくらい理解できるかなと思ったのですが、建設業経理の会計ソフトだったので簿記3級じゃダメでした…

じゃ簿記3級の次に建設業経理士2級を取ろうかと思ったのですが、建設業経理士2級の本を読んでもよく理解できないんですね。
これは簿記2級の知識がないからかな?と考えて、先に簿記2級を取ろうと考えました。

簿記2級の勉強は工業簿記が入ってボリュームも3級の2倍。
家事、育児に加え、正社員への転職活動。就職。新しい会社での仕事。色々あり勉強時間はろくに取れず。
簿記2級の勉強時間は
平日は細切れ時間で通勤時間中もいれて1日30分ぐらいが精一杯。
土日祝の休みの日は早起きして1時間~2時間くらい。
基礎が大事だと思っているので、資格を取ることが目的ではなく、しっかり理解することを目的に1年かかりました。
2016年11月20日 144回の簿記2級に合格しました。
(わからない問題が1問あり96点でした。)
ネットで調べると2級の勉強時間は約6カ月とあるので、やっぱり倍ほどかかっていますね。

今は正社員で仕事中です。
仕事は.Net + Oracle。
もうね。目つぶってても書ける。
正直遣り甲斐も何にもない。
(でもここで簿記2級で勉強した工業簿記の知識が、ほんの少しですが役立ちました。)

簿記2級で簿記の勉強はやめる予定でした。
ネットで調べると1級はオーバースペックだとか、勉強時間が1級>>>>>>>>>>2級>3級だとか色々書かれているので、正直難しいかなと。
簿記1級より、本業のITの勉強をしようと思ってたんです。

でもうちの会社は
新しい言語や新しい仕事はチャレンジ案件としてアンダーフォーティ(30代、20代で構成される若手チーム)が担当し
オーバーフォーティ(40代以降で構成される年配チーム)は安定した大型案件の.Net(VB) + Oracle でチーム分けするので
どんなに新しい言語に挑戦したくても、アサインしてもらえない。
もう新しい言語は勉強しても無駄だなと。

会計システムもあるんですが、こちらもある社員の独占業務でアサインしてもらえない。
でも会計システムのほうは噛める可能性があるので、簿記1級とればアサインされるかも?
どうせこのままなら簿記2級の知識も頭から消えていきそうなので、なにもすることないなら簿記1級とっちゃおう。
簿記1級もってたら、万一会社が潰れても食べていけるかもしれない。
て軽い感じで簿記1級とることを決めました。
前回の転職活動で感じた「業務系のシステム開発で簿記の知識があることは、IT系の資格があるより有利かもしれない」事が1番の理由かもしれません。

今は簿記1級の勉強の70%ぐらいまで来ました。
家事に育児に仕事に、あいかわらず勉強時間はそんなに取れません。
ネットでは簿記1級の勉強時間は1年とあったので、倍の2年は最低でも必要かと思いますが、でもコツコツやればいつかは終わるハズ。
ここまでくると簿記も面白くなってきます。

そんな感じで簿記1級目指して、ゆるくがんばってます。

ASP.NET MVC 13_モデルバインド

VisualStuidioCommunity2015/Fw4.5.2/C#


前回まではモデルの値をビューに表示する方法を見てきました。
今回はビューの値をコントローラーで受け取る方法を見ていきたいと思います。

モデルバインド

モデルバインドとはクライアントからの入力値を、アクションメソッドの引数に自動的に割り当てる機能のことです。
ポストデータやクエリーパラメータ、ルートパラメータなど、リクエストデータと同名の引数(大文字小文字は区別されない)をアクションメソッドに用意しておくだけで、自動的に割り当ててくれます。

まずはモデルバインドの基本的な動作を確認してみます。
以下の例では、ビューに用意したテキストボックス「StringValue」で入力した値が、アクションメソッド「SimpleBind」に用意された同名の引数「stringvalue」にバインドされます。

ビュー
@using (Html.BeginForm("SimpleBind", "ModelBind"))
{
    <dl>
        <dt>@Html.Label("String値:")</dt>
        <dd>@Html.TextBox("StringValue")</dd>
    </dl>
    <div>
        <input type="submit" value="送信" />
    </div>
}
コントローラー
using System.Web.Mvc;

namespace Practice.Controllers
{
    public class ModelBindController : Controller
    {

        public ActionResult Show()
        {
            return View();
        }

        public ActionResult SimpleBind(string stringvalue)
        {
            string value = $"「{stringvalue}」が入力されました。";
            return Content(value);
        }
    }
}



上記の例はアクションメソッドの引数がstring型でしたが、int型に変えてみます。

ビュー
@using (Html.BeginForm("SimpleBind", "ModelBind"))
{
    <dl>
        <dt>@Html.Label("int値:")</dt>
        <dd>@Html.TextBox("IntValue")</dd>
    </dl>
    <div>
        <input type="submit" value="送信" />
    </div>
}
コントローラー
using System.Web.Mvc;

namespace Practice.Controllers
{
    public class ModelBindController : Controller
    {

        public ActionResult Show()
        {
            return View();
        }

        public ActionResult SimpleBind(int intvalue)
        {
            string value = $"「{intvalue}」が入力されました。";
            return Content(value);
        }
    }
}
テキストボックスに何も入力せずに送信したり、数値に変換できない文字を入力して送信すると、「アクションパラメータの引数にnullが設定できないよ」とエラーになってしまいます。

モデルバインダーは、リクエストデータに値が設定されていないときや、アクションメソッドの同名の引数に指定した型に変換できない場合は、引数にnullを設定しようとします。

アクションメソッドの引数が値型の場合、nullを受け入れられるようにnullable型にしておく必要があります。
public ActionResult SimpleBind(int? intvalue)
{
    string value = $"「{intvalue}」が入力されました。";
    return Content(value);
}


アクションメソッドの引数にモデルを指定すると、リクエストデータと同名のプロパティに値をセットしてくれます。
モデルのプロパティが値型の場合、必須でなければnullableにしておきます。

モデル
using System.ComponentModel.DataAnnotations;

namespace Practice.Models
{
    public class BindSampleViewModel
    {
        [Display(Name = "string値")]
        public string StringValue { get; set; }

        [Display(Name = "int値")]
        public int? IntValue { get; set; }
    }
}
ビュー
@model Practice01_Begin.Models.BindSampleViewModel

@using (Html.BeginForm("BindSampleResult", "ModelBind"))
{
<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.StringValue)</dt>
    <dd>@Html.EditorFor(mdl => mdl.StringValue)</dd>
    <dt>@Html.DisplayNameFor(mdl => mdl.IntValue)</dt>
    <dd>@Html.EditorFor(mdl => mdl.IntValue)</dd>
</dl>
<input type = "submit" value = "送信" />
コントローラー
using System.Web.Mvc;

namespace Practice.Controllers
{
    public class ModelBindController : Controller
    {
        public ActionResult BindSample()
        {
            return View();
        }
        public ActionResult BindSampleResult(Models.BindSampleViewModel mdl)
        {
            string value = $"「{mdl.StringValue},{mdl.IntValue}」が入力されました。";
            return Content(value);
        }
    }
}


オーバーポスティング攻撃の対策

アクションメソッドの引数にモデルを指定する場合は「オーバーポスティング攻撃」を受ける可能性が出てきます。
たとえば以下のように、モデルにビューに表示するだけのプロパティ「ImportantValue」があったとします。
using System.ComponentModel.DataAnnotations;

namespace Practice01_Begin.Models
{
    public class BindSampleViewModel
    {
        [Display(Name = "string値")]
        public string StringValue { get; set; }

        [Display(Name = "int値")]
        public int? IntValue { get; set; }

        [Display(Name = "権限")]
        public string Role { get; set; }
    }
}
ビューはStringValueとIntValueのみが編集でき、Roleは表示するだけになっていたとします。
@model Practice01_Begin.Models.BindSampleViewModel

@using (Html.BeginForm("BindSampleResult", "ModelBind"))
{
<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.StringValue)</dt>
    <dd>@Html.EditorFor(mdl => mdl.StringValue)</dd>
    <dt>@Html.DisplayNameFor(mdl => mdl.IntValue)</dt>
    <dd>@Html.EditorFor(mdl => mdl.IntValue)</dd>
    <dd>@Html.DisplayNameFor(mdl => mdl.Role)</dd>
    <dd>@Html.DisplayFor(mdl => mdl.Role)</dd>
</dl>
<input type = "submit" value = "送信" />
コントローラーは先ほどと同じで、引数にモデルを指定します。
ただし、モデルのRoleの値が’admin’であれば、何かしら重要な処理をするとします。
このとき悪意あるユーザーがポストデータのRoleを「admin」に改ざんしたデータを送信すると、意図しない動きになってしまいます。
using System.Web.Mvc;

namespace Practice.Controllers
{
    public class ModelBindController : Controller
    {
        public ActionResult BindSample()
        {
            var mdl = new Models.BindSampleViewModel();
            mdl.StringValue = "StringValue";
            mdl.IntValue = 12345;
            mdl.Role = "user";
            return View(mdl);
        }  
       public ActionResult BindSampleResult(Models.BindSampleViewModel mdl)
 {
     if (mdl.Role != null)
     {
         //"重要な処理をする";
     }
     string str = $"「StringValue:={mdl.StringValue},IntValue:={mdl.IntValue}, Role:={mdl.Role}」が入力されました。";
     return Content(str);
     }
 }
}
自動的にバインドしたくないプロパティがある場合は、
「バインドするプロパティを明示的に指定する」か「バインドしないプロパティを指定する」ことでオーバーポスティング攻撃を防御できます。

バインドするプロパティを明示的に指定するには、
コントローラーのアクションメソッドの引数にBind属性をつけ、Includeプロパティにバインドするプロパティ名を設定します。
public ActionResult BindSampleResult
([Bind(Include = "StringValue, IntValue")] Models.BindSampleViewModel mdl)
{
    ・・・略
}
バインドしないプロパティを指定するには、
コントローラーのアクションメソッドの引数にBind属性をつけ、Excludeプロパティにバインドしないプロパティ名を設定します。
public ActionResult BindSampleResult
([Bind(Exclude = "Role")] Models.BindSampleViewModel mdl)
{
    ・・・略
}
ためしにビューでRoleプロパティを入力できるようにして実行してみます。

Bind属性をつけるとRoleには入力値がバインドされていません。

Bind属性を外すとRoleniha入力値がバインドされています。


IncrudeプロパティかExcludeプロパティのどちらを使用すればよいか、参考にしている本「実践プログラミング ASP.NET MVC5」では、原則としてIncludeプロパティを利用すべきとの記載があります。
Excludeプロパティではあとからプロパティを追加した場合、Exclude定義の更新を忘れて意図しないバインドを受け入れてしまう可能性があり
Includeプロパティではあとからプロパティを追加した場合、Include定義の更新を忘れても、値がバインドされていないという明確な結果になり、問題もすぐ特定できるためとありました。

ASP.NET MVC 12_テンプレートヘルパー ~その2
DataType属性、DisplayFormat属性

VisualStuidioCommunity2015/Fw4.5.2/C#


DisplayForヘルパーはモデルの値を表示形式で出力します。
EditorForヘルパーはモデルの値を入力形式で出力します。
モデルの値の型やDataType属性に指定した値により出力形式が変わります。

DataType属性による DisplayForヘルパー/ EditorForヘルパー の出力の違い

前回はモデルの値の型(sring型、int型、long型、decimal型、DateTime型、bool型、bool?型、列挙型)による出力の違いをみました。
今回はDataType属性(名前空間:System.ComponentModel.DataAnnotations)による出力の違いをみたいと思います。

DataType.Text

DisplayForヘルパーでの出力は、モデルの値がそのまま出力されるだけで、DataType属性の影響はありません。
EditorForヘルパーでは、モデルの値がint型の場合は<input type="number" >と出力さるところ、DataType.Text属性を付けると<input type="text" >と出力されます。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
    [Display(Name = "int型(DataType.Text)")]
    [DataType(DataType.Text)]
    public int IntValue { get; set; }
}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.IntValue = 123456789;
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.IntValue)</dt>
    <dd>@Html.DisplayFor(mdl => mdl.IntValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.IntValue)</dd>
</dl>
出力
<dl>
    <dt>int型(DataType.Text)</dt>
    <dd>123456789</dd>
    <dd><input class="text-box single-line" data-val="true" 
     data-val-number="フィールド int型(DataType.Text) には数字を指定してください。" 
     data-val-required="int型(DataType.Text) フィールドが必要です。" 
     id="IntValue" name="IntValue" type="text" value="123456789" /></dd>
</dl>

DataType.Html

DisplayForヘルパーでの出力は通常HTMLエンコードされて出力されますが、DataType.Html属性をつけるとエンコードされずに出力されます。
EditorForヘルパーでの出力には、DataType属性の影響はありません。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
    [Display(Name = "string型(DataType.Html)")]
    [DataType(DataType.Html)]
    public string HtmlValue { get; set; }
}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.HtmlValue = "<font color='red'>赤字</font>";
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.HtmlValue)</dt>   
    <dd>@Html.DisplayFor(mdl => mdl.HtmlValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.HtmlValue)</dd>
</dl>
出力
<dl>
    <dt>string型(DataType.Html)</dt>   
    <dd><font color='red'>赤字</font></dd>
    <dd><input class="text-box single-line" id="HtmlValue" name="HtmlValue" type="text" 
        value="&lt;font color=&#39;red&#39;&t;赤字&lt;/font&gt;" /></dd>
</dl>

DataType.MultilineText

DisplayForヘルパーでの出力には影響がありません。
EditorForヘルパーでの出力では、テキストエリアが出力されます。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
    [Display(Name = "string型(DataType.MultilineText)")]
    [DataType(DataType.MultilineText)]
    public string MultilineTextValue { get; set; }
}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.MultilineTextValue = "1行目\r\n2行目";
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.MultilineTextValue)</dt>
    <dd>@Html.DisplayFor(mdl => mdl.MultilineTextValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.MultilineTextValue)</dd>
</dl>

出力
<dl>
<dt>string型(DataType.MultilineText)</dt>
        <dd>1行目
            2行目</dd>
        <dd><textarea class="text-box multi-line" id="MultilineTextValue" 
        name="MultilineTextValue">
        1行目
        2行目</textarea></dd>
</dl>

DataType.EmailAddress

DisplayForヘルパーではメールリンク(<a href="mailto:~">)が出力されます。
EditorForヘルパーではテキストボックス(<input type="email" >)が出力されます。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
 [Display(Name = "string型(DataType.EmailAddress)")]
 [DataType(DataType.EmailAddress)]
 public string EmailAddressValue { get; set; }
}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.EmailAddressValue = "aaa@gmail.com";
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.MultilineTextValue)</dt>
    <dd>@Html.DisplayFor(mdl => mdl.MultilineTextValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.MultilineTextValue)</dd>
</dl>

出力
<dl>
    <dt>string型(DataType.EmailAddress)</dt>
    <dd><a href="mailto:aaa@gmail.com">aaa@gmail.com</a></dd>
    <dd><input class="text-box single-line" id="EmailAddressValue" 
        name="EmailAddressValue" type="email" value="aaa@gmail.com" /></dd>
</dl>

DataType.Url

DisplayForヘルパーではハイパーリンク(<a href="~">)が出力されます。
EditorForヘルパーではテキストボックス(<input type="url" >)が出力されます。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
    [Display(Name = "string型(DataType.Url)")]
    [DataType(DataType.Url)]
    public string UrlValue { get; set; }
}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.UrlValue = "https://www.google.co.jp";
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.UrlValue)</dt>
        <dd>@Html.DisplayFor(mdl => mdl.UrlValue)</dd>
        <dd>@Html.EditorFor(mdl => mdl.UrlValue)</dd>
</dl>

出力
<dl>
<dt>string型(DataType.Url)</dt>
        <dd><a href="https://www.google.co.jp">https://www.google.co.jp</a></dd>
        <dd><input class="text-box single-line" id="UrlValue" name="UrlValue" type="url" value="https://www.google.co.jp" /></dd>
</dl>

DataType.Password

DisplayForヘルパーでの出力には影響がありません。
EditorForヘルパーではテキストボックス(<input type="password" >)が出力されます。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
        [Display(Name = "string型(DataType.Password)")]
        [DataType(DataType.Password )]
        public string PasswordValue { get; set; }
}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.PasswordValue  = "ABCD123";
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.PasswordValue)</dt>
        <dd>@Html.DisplayFor(mdl => mdl.PasswordValue)</dd>
        <dd>@Html.EditorFor(mdl => mdl.PasswordValue)</dd>
</dl>

出力
<dl>
 <dt>string型(DataType.Password)</dt>
        <dd>ABCD123</dd>
        <dd><input class="text-box single-line password" id="PasswordValue" name="PasswordValue" type="password" value="ABCD123" /></dd>
</dl>

DataType.PhoneNumber

DisplayForヘルパーでの出力には影響がありません。
EditorForヘルパーではテキストボックス(<input type="tel" >)が出力されます。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
        [Display(Name = "string型(DataType.PhoneNumber)")]
        [DataType(DataType.PhoneNumber )]
        public string PhoneNumberValue { get; set; }
}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.PhoneNumberValue  = "09012345678";
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.PhoneNumberValue)</dt>
    <dd>@Html.DisplayFor(mdl => mdl.PhoneNumberValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.PhoneNumberValue)</dd>
</dl>

出力
<dl>
    <dt>string型(DataType.PhoneNumber)</dt>
    <dd>09012345678</dd>
    <dd><input class="text-box single-line" id="PhoneNumberValue" name="PhoneNumberValue" type="tel" value="09012345678" /></dd>
</dl>

DataType.DateTime、DataType.Date、DataType.Time

DisplayForヘルパーではDataType.DateTimeでは年月日時分秒が出力され、DataType.Dateでは年月日が、DataType.Timeでは時分が出力されます。
EditorForヘルパーではそれぞれにテキストボックス(<input type="datetime" >、<input type="date" >、<input type="time" >)が出力されます。

DataType.Date、DateType.TimeではEditorForで値が出力されていません。
後述のDataFormat属性をつけると出力されます。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
    [DataType(DataType.DateTime)]
    public DateTime DateTimeValue { get; set; }

    [Display(Name = "DateTime(DataType.Date)")]
    [DataType(DataType.Date)]
    public DateTime DateValue { get; set; }

    [Display(Name = "DateTime(DataType.Time)")]
    [DataType(DataType.Time)]
    public DateTime TimeValue { get; set; }}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.DateTimeValue = DateTime.Now;
    mdl.DateValue = DateTime.Now;
    mdl.TimeValue = DateTime.Now;
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.DateTimeValue)</dt>
    <dd>@Html.DisplayFor(mdl => mdl.DateTimeValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.DateTimeValue)</dd>

    <dt>@Html.DisplayNameFor(mdl => mdl.DateValue)</dt>
    <dd>@Html.DisplayFor(mdl => mdl.DateValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.DateValue)</dd>

    <dt>@Html.DisplayNameFor(mdl => mdl.TimeValue)</dt>
    <dd>@Html.DisplayFor(mdl => mdl.TimeValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.TimeValue)</dd>
</dl>

出力
<dl>
    <dt>DateTime(DataType.DateTme)</dt>
    <dd>2016/12/23 6:11:56</dd>
    <dd><input class="text-box single-line" data-val="true" 
        data-val-date="フィールド DateTime(DataType.DateTme) は日付である必要があります。" 
        data-val-required="DateTime(DataType.DateTme) フィールドが必要です。" 
        id="DateTimeValue" name="DateTimeValue" type="datetime" value="2016/12/23 6:11:56" /></dd>

    <dt>DateTime(DataType.Date)</dt>
    <dd>2016/12/23</dd>
    <dd><input class="text-box single-line" 
        data-val="true" data-val-date="フィールド DateTime(DataType.Date) は日付である必要があります。" 
        data-val-required="DateTime(DataType.Date) フィールドが必要です。" 
        id="DateValue" name="DateValue" type="date" value="2016/12/23" /></dd>

    <dt>DateTime(DataType.Time)</dt>
    <dd>6:11</dd>
    <dd><input class="text-box single-line" 
        data-val="true" data-val-required="DateTime(DataType.Time) フィールドが必要です。" 
        id="TimeValue" name="TimeValue" type="time" value="6:11" /></dd>
</dl>

先ほどDataType属性でDataType.DateやDateType.Timeを指定すると、EditorForで出力されたテキストボックスに値が出力されていませんでした。
これはDataFormat属性(名前空間:System.ComponentModel.DataAnnotations)で書式設定方法を指定すると出力されるようになります。


DisplayFormat属性のDataFormatStringプロパティに書式文字列を設定します。
ApplyFormatInEditModeプロパティには編集時にも書式を適用する場合にtrueを設定します。
DisplayFormat属性には他にもプロパティがあります。(後述のまとめ参照)

しかし、DateType.Dateの場合は編集時の書式が「yyyy-MM-dd」ではなく「yyyy/MM/dd」になっています。
ためしに書式を「{0:yyyy年MM月dd日}」としたところ、やはり値が出力されませんでした。
chrome(バージョン:55.0.2883.87)では<intput type="date" >の要素にフォーカスすると、カレンダーが表示されますが、おそらくこのカレンダーが「/」しか対応していないのではないでしょうか。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
    [DataType(DataType.DateTime)]
    [DisplayFormat(DataFormatString = "{0:yy年MM月dd日}", ApplyFormatInEditMode = true)]
    public DateTime DateTimeValue { get; set; }

    [Display(Name = "DateTime(DataType.Date)")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime DateValue { get; set; }

    [Display(Name = "DateTime(DataType.Time)")]
    [DataType(DataType.Time)]
    [DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]
    public DateTime TimeValue { get; set; }
}

DataType.Currency

DataType.Currencyの場合、カレントカルチャ情報に合わせた出力がされます。
DisplayForヘルパーでは、カレントカルチャの通貨情報でフォーマットされ出力されました。
EditorForヘルパーではカレントカルチャの数値情報でフォーマットされ、テキストボックス(<input type="text" >)で出力されました。

モデル
using System.ComponentModel.DataAnnotations;

public class AttributeModel
{
    [Display(Name = "Decimal(DataType.Currency)")]
    [DataType(DataType.Currency)]
    public Decimal CurrencyValue { get; set; }
}
コントローラー
public ActionResult AttributeAction()
{
    var mdl = new Models.AttributeModel();
    mdl.CurrencyValue = 12345678.5678m;
    return View(mdl);
}
ビュー
@model Practice.Models.AttributeModel

<dl>
    <dt>@Html.DisplayNameFor(mdl => mdl.CurrencyValue)</dt>
    <dd>@Html.DisplayFor(mdl => mdl.CurrencyValue)</dd>
    <dd>@Html.EditorFor(mdl => mdl.CurrencyValue)</dd>
</dl>

出力
<dl>
    <dt>Decimal(DataType.Currency)</dt>
    <dd>¥12,345,679</dd>
    <dd><input class="text-box single-line" data-val="true" 
        data-val-number="フィールド Decimal(DataType.Currency) には数字を指定してください。" 
        data-val-required="Decimal(DataType.Currency) フィールドが必要です。" 
        id="CurrencyValue" name="CurrencyValue" type="text" value="12345678.57" /></dd>
</dl>



まとめ

主なDataType属性
DataTypeDisplaryForヘルパーEditorForヘルパー
DataType.Textテキストボックス
<input type="text" >
DataType.Html値をエンコードせずに出力するテキストボックス
<input type="text" >
DataType.MultilineTextテキストエリア
<textarea>
DataType.EmailAddressメールリンク
<a href="mailto:~">
テキストボックス
<input type="email" >
DataType.Urlハイパーリンク
<a href="~">
テキストボックス
<input type="url" >
DataType.Passwordテキストボックス
<input type="password" >
DataType.PhoneNumber テキストボックス
<input type="tel" >
DataType.DateTime年月日時分秒が出力されるテキストボックス
<input type="datetime" >
DataType.Date年月日が出力されるテキストボックス
<input type="date" >
DataType.Time時分が出力されるテキストボックス
<input type="time" >
DataType.Currencyカレントカルチャの金額情報でフォーマットされ出力されるカレントカルチャの数値情報でフォーマットされ出力される
<input type="time" >

DisplayFormat属性
DateFormatString書式文字列
ApplyFormatInEditMode編集時にも書式を適用するかどうか
ConvertEmptyStringToNull空文字列をnullに変換するかどうか
NullDisplayText値がnullの時に表示するテキスト