2018年6月11日月曜日

簿記 簿記2級で使用した教材

簿記3級で使用した教材に続いて、
私が簿記2級で使用した教材を紹介します。

簿記3級では、TAC出版の「スッキリシリーズ」と「合格トレーニング」を使用したので
とりあえず簿記2級も同じシリーズを購入して勉強を始めました。
スッキリわかる日商簿記2級 商業簿記

スッキリわかる 日商簿記2級 工業簿記

合格トレーニング日商簿記2級商業簿記

合格トレーニング 日商簿記2級 工業簿記


簿記3級の流れで同じシリーズの本を買いましたが、
正直なところ簿記2級からは(ネコはかわいいけど)スッキリシリーズでは少し内容が足りないと思います。
特に工業簿記はスキッリシリーズでは理解が不足しました。

簿記1級の勉強ではネコは卒業して、同じTAC出版の簿記の教科書と簿記の問題集を使っています。
簿記2級の勉強の時は使用していなかったのですが、「スッキリシリーズ + 合格トレーニング」の組み合わせより、「簿記の教科書 + 簿記の問題集」 の組み合わせのほうが、理解が深まるかもしれません。
書店などで内容を確認してから購入することをお勧めします。


テキストと合格トレーニングで一通り勉強が終わってから、過去問と予想問題を買ってみました。
とりあえず同じスッキリシリーズからチョイス
スッキリとける日商簿記2級過去+予想問題集

とりあえず買ってみたけど、これも要らなかったかもしれません。
最後に紹介するネットスクールの過去問だけで良かったかなと思います。
簿記2級からは商業簿記に加え、新たに工業簿記が入ってきます。
過去問や予想問題をすると、どうも工業簿記が弱いことに気が付きました。
少し問題を捻られると、時間がかかったり解けなかったりします。


工業簿記はまだ勉強が足りないな…と思い、下記の本を購入してみました。
検定簿記ワークブック2級工業簿記 日本商工会議所主催簿記検定試験

これは私にはあまり役に立たなかったです。
この本を購入した時はわからなかったのですが、私が知りたいことは工業簿記の効率的な解き方で、計算の下書きの仕方だったようです。
このワークは工業簿記の問題集であり、効率的な解き方を書いている本ではありません。
この時は問題の数をこなせば慣れるかと思って購入しましたが、問題を解いてもあまり効率が上がることはありませんでした。


次に工業簿記のために買った本は、
パブロフ流でみんな合格日商簿記2級工業簿記総仕上げ問題集
これは本当に良かった!
工業簿記のボックス図の書き方が手書きで書かれていて、あ~こう書けば時間短縮できるのね!とかがわかったり
ボックス図だらけで解いているうちに混乱してしまっていたのが、一気にスッと理解できました。
内容はとても易しいものばかりなのですが、これ1冊で苦手だった工業簿記が得意になった1冊でした。
工業簿記が苦手だなと感じる方にはお勧めです。


最後に過去問はネットスクールの日商簿記検定模擬試験問題集2級をチョイス。
最後の1~2カ月はこの過去問を何周も回していました。
この過去問は解説に誤記が結構あるのですが、必要最低限の内容で良かったです。
過去問を解く段階までくると、そんなに詳しい解説も必要がないと思いますので、過去問と必要最低限の解説で十分かと思います。


今は商業簿記より工業簿記のほうが得意です。
簿記2級の本試験では商業簿記の問2か問3に超難問が入り、工業簿記は基本に忠実な問題が多く得点源です。
また商業簿記は新論点など過去問にはない問題が出題される可能性があります。
その点、工業簿記は基本に忠実で新論点の出題もありません。
工業簿記は満点を取るつもりでがっつり勉強して、商業簿記で1問捨てる覚悟で本試験に挑みました。

また過去問を解くときも、工業簿記から問5→問4→次に商業簿記の問1→問2か問3の時間が掛からなさそうなほうを解くようにしました。
過去問では3周目ぐらいでも全問解くのにギリギリ2時間。全問満点もなかなか取れなかったのですが
本試験(144回)は簡単な問題だったのか、全問解いてから、見直しに全問もう一度解けるほど、時間が余りました。
点数は96点。商業簿記でどうしても理解できない問題があって(日本語の言い回しがわからなかった)、間違えたのはその1問だけでした。


簿記2級の勉強は、簿記3級の下地があるのでそこまで大変だとは感じませんでした。
ボリュームは工業簿記が増える分だけ簿記3級の倍にはなりますが、単純にボリュームが増えるだけなので、
コツコツ毎日続けていればいつか終わります。
簿記2級では工業簿記をしっかりマスターすることがキモだと思います。

2018年6月8日金曜日

簿記 簿記3級で使用した教材

今日は私が簿記3級で使用した教材を紹介します。

私の仕事はIT系なのですが、新しいプログラム言語を勉強するときには本を購入します。
この本を選ぶ際は以下のマイルールがあります。
  1. まず1冊目は簡単で易しいものを選ぶこと。
  2. 次の1冊はより専門的な難しいものを選ぶこと。
1冊目から調子に乗って専門的な難しい本を読むと、たいがい書いていることが理解できず嫌になります。
でも1冊目に簡単で易しい本を読むと、専門的な難しい本も理解できるようになっています。
簡単で易しい本だけを読んで専門的な本を読まずにいると、プログラムは書けるけれど、なぜそうなっているのかなど本質が理解できません。


そんなわけで簿記も同じだろうと思い、マイルールにのっとりまずは評判の良い易しそうな本を選ぶことにしました。

TAC出版 スッキリわかるシリーズ 
スッキリわかる 日商簿記3級 [テキスト&問題集]

ネコが可愛いです。
易しい文章で、簿記が初めてでも問題なく理解できると思います。
簿記3級であればこの1冊で大丈夫かもしれません。


わたしは問題が少なくてちょっと不安だったので下記の問題集を購入しました。
TAC出版 よくわかる簿記シリーズ
合格トレーニング日商簿記3級

この問題集はテキストの内容の理解を深めるのに役立ちました。
(時間がなければ、この問題集は必要ないかもしれません。余力があれば確実に理解は深まります。)


簿記3級で購入したテキストは以上の2冊です。
過去問などは買わなくても大丈夫でした。

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

勉強方法は簿記の勉強方法に書きましたが、テキスト→問題集→ノートにまとめる方法です。

今は簿記1級を勉強中ですが、簿記3級の勉強は簿記の知識がほぼゼロの状態からのスタートだったので一番キツかったです。
ネットで検索すると簿記3級は最速1カ月、だいたい3カ月で合格できるそうです。
たとえ仕事と家事育児で時間が取れなくても、諦めなければ時間はかかってもいつかは合格できるので、たとえ10分でも毎日続けることが大事だと思います。


次回は簿記2級で使用したテキストを紹介したいと思います。

2018年6月7日木曜日

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

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

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

まず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台ですが、私が過去使用した電卓と、現在使用している電卓の紹介でした。


2018年6月4日月曜日

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

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


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

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

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


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

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

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


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

2018年6月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、衣服のチョイスは慎重に。


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

2018年5月31日木曜日

簿記の勉強方法

簿記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級持ってるならコレわかるよね?」とパッと聞かれて答えられる人を目指してます。

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

2018年5月30日水曜日

簿記を勉強したきっかけ

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級目指して、ゆるくがんばってます。

2016年12月28日水曜日

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定義の更新を忘れても、値がバインドされていないという明確な結果になり、問題もすぐ特定できるためとありました。

2016年12月24日土曜日

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の時に表示するテキスト

2016年12月18日日曜日

ASP.NET MVC 12_テンプレートヘルパー ~その1~

VisualStuidioCommunity2015/Fw4.5.2/C#


前回までは個別のHTMLヘルパーを見てきました。
今回はテンプレートヘルパーを見て行きます。

テンプレートヘルパーは、引数に指定したモデルのプロパティの型やその属性から自動的にHTML要素を生成してくれます。
たとえばstring型であればinput要素を、bool型であればcheckbox要素を生成するといった具合です。

DisplayNameForヘルパー

DisplayNameForヘルパーは、モデルのプロパティの表示名をhtmlタグで修飾せずに出力します。
属性を指定しない場合、プロパティ名をそのまま出力します。
DisplayName属性を指定した場合、指定した値を出力します。
Display属性のnameプロパティを指定した場合も、指定した値を出力します。

モデル
//DisplayName属性を使用する場合にインポートする
using System.ComponentModel;
//Display属性を使用する場合にインポートする
using System.ComponentModel.DataAnnotations;

namespace Practice.Models
{
    public class TemplateHelperViewModel
    {
        public string Text1 { get; set; }

        [DisplayName("テキスト2")]
        public string Text2 { get; set; }

        [Display(Name = "テキスト3")]
        public string Text3 { get; set; }
    }
}
コントローラー
using System.Web.Mvc;

namespace Practice.Controllers
{
    public class TemplateHelperController : Controller
    {
        public ActionResult Index()
        {
            var mdl = new Models.TemplateHelperViewModel();
            return View(mdl);
        }
    }
}
ビュー
@model Practice.Models.TemplateHelperViewModel

@Html.DisplayNameFor(mdl => mdl.Text1)
@Html.DisplayNameFor(mdl => mdl.Text2)
@Html.DisplayNameFor(mdl => mdl.Text3)

DisplayName属性(名前空間:System.ComponentModel)は、表示名しか指定できませんが、
Display属性(名前空間:System.ComponentModel.DataAnnotations)は、表示名以外にも表示方法をカスタマイズするためのプロパティがあります。
たとえば表示名をリソースファイルから出力するなど、Display属性でなければできない事がありますので、より汎用的なDisplay属性を使用する方がよさそうです。

DisplayForヘルパー/ EditorForヘルパー

DisplayForヘルパーはモデルの値を表示形式で出力します。
EditorForヘルパーはモデルの値を入力形式で出力します。
モデルの値の型やDataType属性(名前空間:System.ComponentModel.DataAnnotations)に指定した値により出力形式が変わります。

モデルの型による出力

まずはモデルの値の型によってどのような出力がされるか見ていきます。
string型、int型、long型、decimal型、DateTime型、bool型、bool?型(Nullable)、列挙型についてみてみます。

モデル
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace Practice.Models
{    
    public enum WeweathereType
    {
        [Display(Name = "晴れ")]
        sunny,
        [Display(Name = "曇")]
        cloudy,
        [Display(Name = "雨")]
        rainy
    }
    
    public class DisplayForViewModel
    {
        [Display(Name ="String型")]
        public string StringValue { get; set; }

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

        [Display(Name = "long型")]
        public long LongValue { get; set; }

        [Display(Name = "decimal型")]
        public decimal DecimalValue { get; set; }

        [Display(Name = "DateTime型")]
        public DateTime DateTimeValue { get; set; }

        [Display(Name = "bool型")]
        public bool BoolValue { get; set; }

        [Display(Name = "bool(Nullable)型")]
        public bool? NullableBoolValue { get; set; }

        [Display(Name = "enum型")]
        public WeweathereType EnumValue { get; set; }  
    }
}
コントローラー
using System;
using System.Collections.Generic;
using System.Web.Mvc;

namespace Practice.Controllers
{
    public class TemplateHelperController : Controller
    {
        public ActionResult Index()
        {
            var mdl = new Models.DisplayForViewModel();
            mdl.StringValue = "赤字";
            mdl.IntValue = 123456789;
            mdl.LongValue = 123456789012345;
            mdl.DecimalValue = 12345.99999m;
            mdl.DateTimeValue = new DateTime(2017,01,01);
            mdl.BoolValue = true;
            mdl.NullableBoolValue = true;
            mdl.EnumValue = Models.WeweathereType.rainy;
            return View(mdl);
        }
    }
}
ビュー
@model Practice.Models.Index

@Html.DisplayNameFor(mdl => mdl.StringValue)
@Html.DisplayFor(mdl => mdl.StringValue)
@Html.EditorFor(mdl => mdl.StringValue)
@Html.DisplayNameFor(mdl => mdl.IntValue)
@Html.DisplayFor(mdl => mdl.IntValue)
@Html.EditorFor(mdl => mdl.IntValue)
@Html.DisplayNameFor(mdl => mdl.LongValue)
@Html.DisplayFor(mdl => mdl.LongValue)
@Html.EditorFor(mdl => mdl.LongValue)
@Html.DisplayNameFor(mdl => mdl.DecimalValue)
@Html.DisplayFor(mdl => mdl.DecimalValue)
@Html.EditorFor(mdl => mdl.DecimalValue)
@Html.DisplayNameFor(mdl => mdl.DateTimeValue)
@Html.DisplayFor(mdl => mdl.DateTimeValue)
@Html.EditorFor(mdl => mdl.DateTimeValue)
@Html.DisplayNameFor(mdl => mdl.BoolValue)
@Html.DisplayFor(mdl => mdl.BoolValue)
@Html.EditorFor(mdl => mdl.BoolValue)
@Html.DisplayNameFor(mdl => mdl.NullableBoolValue)
@Html.DisplayFor(mdl => mdl.NullableBoolValue)
@Html.EditorFor(mdl => mdl.NullableBoolValue)
@Html.DisplayNameFor(mdl => mdl.EnumValue)
@Html.DisplayFor(mdl => mdl.EnumValue)
@Html.EditorFor(mdl => mdl.EnumValue)
出力

データ型による出力の違い
データ型DisplayForヘルパーの出力EditorForヘルパーの出力
string型htmlエンコードされて出力されるテキストボックス
<input type="text" >
int型テキストボックス
<input type="number" >
long型テキストボックス
<input type="number" >
decimal型値が丸められて出力されるテキストボックス
<input type="text" >
値が丸められて出力される。
DateTime型テキストボックス
<input type="datetime" >
bool型無効なチェックボックス
<input type="checkbox" disabled="disabled" >
hidden要素は出力されない
チェックボックス型
<input type="checkbox" >
Hidden要素(<input type="hidden" >)が出力される。
bool?型(Nullable)無効なドロップダウン
<select disabled="disabled">
ドロップダウン
<select>
列挙型テキストボックス
<input type="text" >
decimal型は予想に反してtype="text"として出力されました。
bool型はチェックボックスとして、Nullableなbool型はドロップダウンとして出力されます。
enum型はテキストボックスとして表示されましたが、コチラではドロップダウンとして表示されると記載されています。


<dl>
<dt>String型</dt>
        <dd><font color='red'>赤字</font></dd>
        <dd><input class="text-box single-line" id="StringValue" name="StringValue" type="text" 
         value="<font color='red'>赤字</font>" /></dd>
<dt>int型</dd>
        <dd>123456789</dd>
        <dd><input class="text-box single-line" data-val="true" 
         data-val-number="フィールド int型 には数字を指定してください。" 
         data-val-required="int型 フィールドが必要です。" id="IntValue" name="IntValue" 
         type="number" value="123456789" /></dd>
<dt>long型</dd>
        <dd>123456789012345</dd>
        <dd><input class="text-box single-line" data-val="true" 
         data-val-number="フィールド long型 には数字を指定してください。" 
         data-val-required="long型 フィールドが必要です。" 
         id="LongValue" name="LongValue" type="number" value="123456789012345" /></dd>
<dt>decimal型</dd>
        <dd>12346.00</dd>
        <dd><input class="text-box single-line" data-val="true" 
         data-val-number="フィールド decimal型 には数字を指定してください。" 
         data-val-required="decimal型 フィールドが必要です。" 
         id="DecimalValue" name="DecimalValue" type="text" value="12346.00" /></dd>
<dt>DateTime型</dd>
        <dd>2017/01/01 0:00:00</dd>
        <dd><input class="text-box single-line" data-val="true" 
         data-val-date="フィールド DateTime型 は日付である必要があります。" 
         data-val-required="DateTime型 フィールドが必要です。" id="DateTimeValue" 
         name="DateTimeValue" type="datetime" value="2017/01/01 0:00:00" /></dd>
<dt>bool型</dd>
        <dd><input checked="checked" class="check-box" disabled="disabled" 
         type="checkbox" /></dd>
        <dd><input checked="checked" class="check-box" data-val="true" 
         data-val-required="bool型 フィールドが必要です。" id="BoolValue" name="BoolValue" 
         type="checkbox" value="true" />
         <input name="BoolValue" type="hidden" value="false" /></dd>
<dt>bool(Nullable)型</dd>
        <dd><select class="tri-state list-box" disabled="disabled">
         <option value="">設定なし</option>
         <option selected="selected" value="true">True</option>
         <option value="false">False</option>
         </select>
        </dd>
        <dd><select class="list-box tri-state" id="NullableBoolValue" name="NullableBoolValue">
         <option value="">設定なし</option>
   <option selected="selected" value="true">True</option>
   <option value="false">False</option>
   </select>
  </dd>
<dt>enum型</dd>
        <dd>rainy</dd>
        <dd><input class="text-box single-line" data-val="true" 
         data-val-required="enum型 フィールドが必要です。" id="EnumValue" name="EnumValue" 
         type="text" value="rainy" /></dd>
</dl>