1

カスタム プロパティを横幅の ViewDataDictionary に追加する最も実用的な方法は何ですか?

簡単なケースを想定してみましょう:

public ActionResult Index()
{
  // ViewData["Title"] = "Home";
  ViewData.Title = "Home";
  return View();
}

最初に頭に浮かぶのは、カスタム クラスとアプリケーション ベース コントローラーでの "new" の使用です。

public class CustomDataDictionary : ViewDataDictionary
{
  public string Title { get; set; }
}

public class ApplicationController : Controller
{
    public new CustomDataDictionary ViewData { get; set;} 
}

ビューでもカスタム ビュー データ ディクショナリを使用するには、同じプロパティを持つ対応する CustomViewPage も作成する必要があると思います。

2 番目に思い浮かぶのは、ViewDataDictionaryExtensions クラスを作成することです。

第三に、「View Model」を使用します。View Models に関する私の欠点は、少なくとも前の 2 つのオプションと比較すると、常に 1 つを作成して View に渡すことです。

本当の目標は、各アプリケーションが、そのアプリケーションの目的に適した ViewData の主要なプロパティ セットを持つようにすることです。私はディクショナリ キーに頼るのをためらう傾向があります。他の開発者が実際のプロパティを使用して、設定するデータを知ることができると便利です。さらに、キーは簡単にスペルを間違えることがあります。

3 つの方法はすべて、仕事を成し遂げます。他の人は何をしましたか?

4

3 に答える 3

0

最終的に、少なくともこのアプリでは、基本の AppViewModel クラスを用意しました。Controller.OnActionExecute/ed は、ViewData.Model が設定されていることを確認します。設定されていない場合は、AppViewModel のインスタンスがその場所に配置されるため、すべてのページで動作する一貫したモデル (Model.Title、Model.IsAuthenticated、Model) があります。 .ユーザーなど)

次に、より詳細なコントローラー アクションには、アクション自体で手動で ViewData.Model に設定されるか、属性を介して OnExecute/ed で設定される AppModelView のサブクラスがあります。

コードはそれほど多くありませんが、すべてのコントローラーアクションで同じ古い作成/設定コードを繰り返さないようにします。そして私にとっては、コントローラー API を乱雑にするのではなく、ビュー データをパッケージとして保持します。

于 2009-05-04T17:44:36.660 に答える
0

名前のスペルが間違っているという問題について - それが定数の目的です。

適切に入力するにはViewData、継承する必要があります。あなたがそれを行う頃には、キーを設定する一般的なコードをコントローラーに簡単に追加できなかったのではないかと思います。

キーを使用することは、少なくとも私には、最も単純な答えのように思えます。これは、最も多くの場合 (つまり、特定のコードが基本的なものしか知らない場合IDictionary<string,object>) でも機能します。

この関連する質問にも興味があるかもしれません。

于 2009-04-17T08:58:31.960 に答える
0

それらはすべて機能するように聞こえます。どちらを選択するかは、要件/ニーズが何であるかによって異なります。(本当にユニークで有益な答えですね?)

あなたの質問は「他の人は何をしましたか?」でした。けれど。したがって、ポーリングを行っている場合、は最近、小規模なアプリケーションに定数アプローチを使用しました。私はまだエンタープライズ MVC アプリを作成していませんが、Controller を継承し、それらの追加のプロパティを定義する基本クラスをおそらく作成すると思います。そして、それらを一貫してビューに渡したい場合は、同様にモデルの基本クラスを用意します。ただし、これは慎重に使用する必要があります。形式的に入力したとしても、グローバルのように動作します。ですから、当然注意が必要です。

于 2009-05-03T13:08:45.567 に答える