2009-09-15 13 views
5

MVCアプリケーションで作業していますが、どのような状況で強く型付けされたビューを使用するのが最善であるのか、そうでないのだろうかと疑問に思っています。これはベストプラクティスの疑問です。私は電子商取引アプリを作っています。注文、商品などの表があります。この質問に私が取り組んでいる部分は、管理者がストアアイテムを追加するための新しい製品ページを追加したことです。強く型付けされたビューを使用することを知るときは大きな助けになるでしょう。強く型付けされたビューはいつ使うべきですか?

私は既に関連する質問を探していますが、最初の3ページほどで何も飛び出しませんでしたが、投稿を知っていれば私に指示してください。

ありがとうございました。

答えて

2

私はできる限り強く型付けされたビューを使用していますので、ビュー内のViewDataのさまざまなビットのすべてのキャストから離れることができます。

ビュー用に複数のソースからの情報が必要なときはいつでも、自分の強く型付けされたビューを作成します。

たとえば、私のチェックアウトでは、注文が必要ですが、料金表示のためのユーザーの好みもあります。 OrderとPriceDisplayプロパティを持つCheckoutViewModelを作成しました。

私は他の人が雄弁に、私が提起するもう一つのポイントがあると思い述べたものを繰り返していますが、

ダン

+0

まさに!同意する。 –

0

ビューでそのタイプのインスタンスを変更するときは、強く型付けされたビューが最も適しています。

たとえば、ビューで製品を編集または作成する場合、製品クラスの厳密な型指定されたビューを持つことは間違いありません。

基本的なデータネットワーク層に何も接続していない状態でテキストや画像を表示しているのであれば、強く型付けされたビューなしで移動する方が簡単でしょう。

これは私の経験ではMVCでもっと仕事をしていくうちに自然にやってきます。

5

ビューに特定のオブジェクトまたはオブジェクトのコレクションに関するデータを表示する必要があるときはいつでも、厳密に型指定されたビューを使用します。

あなたのビューは純粋に情報であれば、あなたは情報の小さなビットを渡すためにModelStateを使用することができる(例えば:成功/エラーページ、メッセージの権限がない、等)私のアプリケーションでは

、I強く型付けされたすべてのビューを持っているので、ユーザーのログイン情報をマスターページに簡単に渡すことができます。つまり、私のすべてのビューは強く型付けされ、テンプレート化され、サイト構成とユーザー・ログイン情報を含む基本クラスに制約されます。そのための

、私はこれを行うことができます。マスターページはONLYモデルに移入された内容に基づいてテーマにしているので、ビュー自体がデータベースにヒットをトリガーすることはありません、

public class MyBaseMasterPage : ViewMasterPage<MyBaseModel> 
{ 
    public string CurrentTheme 
    { 
     get 
     { 
      if (this.Model.CurrentUser != null) 
       return this.Model.CurrentUser.Theme; 

      else return this.Model.Config.DefaultTheme; 
     } 
    } 

    public User CurrentUser { get { return this.Model.CurrentUser; } } 

    public ConfigurationRepository Config { get { return this.Model.Config; } } 
} 

注意を/キャッシュ。

MyBaseModelはそうのように構成されています

public class MyBaseModel 
{ 
    private MyBaseModel() { } 

    public MyBaseModel(MyBaseController controller) 
    { 
     this.CurrentUser = controller.CurrentUser; 
     this.Config = controller.Config; 
    } 

    public User CurrentUser { get; private set; } 

    public ConfigurationRepository Config { get; private set; } 
} 

プライベートコンストラクタはsoruceコントローラでモデルを初期化するために、私のモデルのすべてのサブクラスを強制します。

コントローラー基本クラスは、ユーザーをセッションから解放し、キャッシュから構成を取り消します。

このように、私のすべてのビューは、DBにヒットすることなく、ユーザーと設定データにアクセスできます。 MyBaseControllerで今

、:

public class LanLordzBaseController : Controller 
{ 
    [Obsolete] 
    protected new ViewResult View(string viewName, object model) 
    { 
     if (model == null) 
     { 
      throw new ArgumentNullException("model"); 
     } 

     if (!(model is MyBaseModel)) 
     { 
      throw new ArgumentException("The model you passed is not a valid model.", "model"); 
     } 

     return base.View(viewName, model); 
    } 

    protected ViewResult View(string viewName, MyBaseModelmodel) 
    { 
     if (model == null) 
     { 
      throw new ArgumentNullException("model"); 
     } 

     return base.View(viewName, (object)model); 
    } 

    public ConfigurationRepository Config { get { ... } } 

    public User CurrentUser { get { ... } } 
} 

これは私が適切な基本クラスから継承されていなかったビューを返した私のコントローラのすべてを見つける助けました。

+0

John、カスタムメンバーシッププロバイダを使用していますか? – Lazarus

+0

はい、私は自分自身を転がしました。 –

+0

うーん、それはとても便利ですね。私たちの意見はすべて厳密に入力されており、独自のMembershipProviderとMembershipUserを作成しています。マスターページを変更してその情報にぶつかったのはどうでしたか? – Jedidja

0

に役立ちます願っています。ビューは、モデル、ビュー、コントローラの概念の一部であり、モデルをユーザーに視覚的に提示するためのものです。本質的にモデルの表現であるとすれば、それが強く型付けされることは理にかなっている。

Add、Deleteなどのアクティビティからの結果メッセージなどの小さなデータを渡すために、私はこれまでにModelStateまたはTempStateを使用しています。View型とは無関係のコレクションを渡すためにStateを使用したいと思うときはいつでも私は、その機能を部分的なビューにリファクタリングし、別個のコントローラアクションを通して提示します。

私のコードでは、一般的に、関連する型はビューが強く型付けされる基底型から階層的に参照されるため、必要に応じてビュー内でアクセスできます。

+0

"ModelStateまたはTempState"は "ViewDataまたはTempData"を読み込むべきだと思います。 –

+0

あなたはそうです...脳が揚げられました! – Lazarus

3

データがある場合は、厳密に型指定されたビューが必要です。期間。

1

常に。さらに進んで、厳密に型指定されたコントロールとHtmlHelperアクションを使用します。ほとんどはMvcContribライブラリで利用できます。

関連する問題