1

モデルに Person クラスがあり、その属性のうち 15 個をビューのラベルに割り当てたいと考えています。ビューはモデルにアクセスすべきではありません。これは、コントローラーが Person の作成を処理することを意味します。ビューはコントローラーからこれらの Person 属性をどのように取得しますか? Controller に Person 型のメンバーが含まれている場合、View は次のような処理を実行できます。

lblFirstName.Text = theController.Person.FirstName;

lblLastName.Text = theController.Person.LastName;

lblCity.Text = theController.Person.City;

ただし、ビューはまだモデル (つまり、人物) に直接アクセスしています。コントローラーは独自の Person クラスを持ち、モデルのすべての Person 属性をコントローラーにコピーし、ビューで上記の構文を使用することができます。しかし、そのデザインには多くの重複があります。助言がありますか?


ちなみにこれはwinformです。モデルは別のプロジェクト/DLL でもあります。DTOとは?

モデルの Person 属性には特別なロジックがあり、ビューで問題が発生することは望ましくありません。たとえば、ビューは次のようになります。

文字列 fn = myController.Firstname;

また、FirstName プロパティのロジックが原因で例外がスローされます。そのため、コントローラーの軽量 (複製) バージョンの Person オブジェクトには、そのプロパティが文字列のみであるため、これらの問題はありません。

また、コントローラーからの非表示の Person プロパティを処理するために、ビューにはモデルへの参照が必要になることにも注意してください。私はそれが気に入りません。

4

4 に答える 4

2

少し話題から外れていますが(MVCで)、あなたの問題についての話題について:

扱いにくいソリューションを使用しないのはなぜですか? 単純に 15 個のラベルに 15 個の値を割り当てる必要がある場合は、Label オブジェクトの設計時の名前をキーとして使用するインデックス付きのプロパティまたはメソッドをコントローラーに与えて、エンティティ プロパティ名のディクショナリまたはリフレクションを使用してモデルから適切な値を取得できます。大きな switch ステートメント:

foreach(Control control in myLabelsPanel.Controls)
{
    Label label = control as Label;
    if(label != null)
    {
        label.Text = myController.TextForKey[label.Name];
    }
}

編集:モデルエンティティクラスにアクセスするビューが悪いことだとは思わないことを追加するのを忘れました。結局のところ、それらはモデルであり、ViewModel の一部になることができ (そのパラダイムを使用している場合)、MVC は View がモデルを認識することを奨励します (その逆ではありません)。

于 2009-01-14T01:18:18.523 に答える
0

その人物はビューデータに含まれている可能性があります。個人的には、コントローラーが既に取得したモデル タイプのインスタンスにアクセスするビューに大きな問題があるとは思わないので、個人的にはビューにPerson直接表示させます。

ビューモデルのように、多くの深いプロパティが必要な場合は、モデルをビューモデルにフラット化することが望ましい場合がありperson.Foo.Bar.Blipますobj.Blip

単一のオブジェクトを扱っている場合、別のオプションは、各値を個別に辞書に入れることですが、これは少し面倒です。

もう 1 つの選択肢は、匿名型の悪用です。しかし、これをしないでください!ここで詳細を繰り返すことさえしません。しかし、ここにあります

于 2009-01-13T23:49:26.270 に答える
0

プロパティを持つオブジェクトであるDTOクラスを使用する場合、またはより厳密にはコンストラクターと一連の読み取り専用プロパティである場合、モデル内の懸念をさらに深く分離できます。最初はコードを複製しているように見えるかもしれませんが、モデルから期待されるさまざまな種類のビューと結果を処理する非常に柔軟な方法になります。

于 2009-01-13T23:51:19.837 に答える
0

ビューでモデルを共有できない理由がわかりません。重複する必要はなく、DTO を使用する必要もないように思われるので、Person in the state バッグを渡すだけで問題ありません。

サービスのことをもっと考えていると思います。ビューがサービスにアクセスするのは望ましくありませんが、コントローラーはそれをパッケージ化してからビューに送信します。単純なモデルに関しては、私見でそれを送信することに実際に欠点はありません。他の唯一の方法は、ビューと同じプロジェクトにモデルを配置することです。これは、送信する値のみを除いて、本質的にモデルのコピーになります。その場合、私は利点を見ることができましたが、繰り返します...あなたの例はそれほど専門的ではありません.

于 2009-01-13T23:55:47.707 に答える