2012-03-28 13 views
6

私はasp.netのMVCを学習し、何か面白いもの見つけています:ASP.net MVC ViewのモデルとViewData.Model?

私が明示的にエラーメッセージを表示するのModelビュー内からは、それが何のセッターを持っていないことを言って定義できないようですが。

@{ this.Model = "Hello" } //error

それから私はWebViewPage.csでソースコードを見て、ビューのモデルプロパティには次のように実際にある:

public object Model { get { return ViewData.Model; } }

このようにエラーが発生しました。

しかし、私がこれを行うことができますどのように面白い:@{ ViewData.Model = "hello"; }を、実際に「ハロー」

私はあまりそれに探していると思うし、その結果、@modelステートメントを使用することができるが、なぜこれがそうですか? C#とASP.NETで

初心者ModelBindersと何時にはコンテキストでモデルを変更する必要があるので、彼らはセッターを必要としないような

+0

@BrokenGlassおそらくあなたは彼の質問をよく読んでみる必要があります。その初心者のちょっとした質問...その説明に役立つ/役立ちます。 – NiK

+0

@Jan Carlo Virayあなたの質問を明確にすることができますか? 「どうして?」 –

+0

'@ Model'が' ViewData'ディクショナリに含まれていることは、実際には分かりませんでした。驚くべきことに、私はViewDataの使用に対していくつかの尊敬されているソース** RAIL **を聞いたので、ここでもフレームワークに組み込まれています。 –

答えて

7

ルールは分離の問題です。MVCでは、コントローラはモデルをビューに提供し、常にモデルをビューに設定/割り当てることができます。ビューで使用できるのはコントローラです...これは...ルールによってプレイは私が言うものです...デザインであり、あなたはその偉大なMVCを学んでいると私は強く魔法はありません

Stevens Sandersons MVC book

2

物事。別の理由は単体テストを容易にするためです。

ただし、あなたは自分の意見でこれを行う必要はほとんどありませんので、あなた自身の責任において悪用してください。

1

を読むためにあなたを推薦する場合はここに。最初のケースでは(あなたが指摘したように)、Modelプロパティのプロパティセッターはありません。だから、あなたは何も割り当てることはできません。そしてそれは理にかなっています - なぜあなたは、モデルをビュー内から再割り当てする必要がありますか?

2番目のケースでは、ViewData.Modelを直接使用してその制約をハック/バイパスします。それはObject型なので、何かを割り当てることができます。

(ところで、私は最初のコードに想定し、割り当てるスニペット「こんにちは」ではなく、「こんにちは」)

2

これはAPI設計の「ピット成功の」理論です。ビューでModelプロパティを変更する必要はありません。そのため、モデルプロパティの変更が難しくなります。しかし、あなたが選択の余地がない場合があるかもしれないので、彼らはそれを不可能にしません。

関連する問題