3

私は次のようなモデルを持っています:

public class SampleModel
{
    public static SampleModel Create()
    {
        return new SampleModel
        {
            Boolean = true,
            // set several more properties...
            Colors = new SelectList(new[] { "Red", "Green", "Blue" }, "Green")
        };
    }

    public bool Boolean { get; set; }
    // define several more properties...
    public SelectList Colors { get; set; }
}

Html.DisplayForModel()ASP.NET MVCに、詳細ビューとHtml.EditorForModel()編集ビューに使用するプロパティを自動的にスキャフォールディングさせています。

結果:

  • 編集ビューはうまく機能します。Colorsは3つの項目(赤、緑、青)のメニューとして表示され、デフォルトでは緑が選択されています。

  • ただし、詳細ビューの場合、「False True False」がIsSelected表示されます。これは、メニューの各項目の値のリストであるようです。それは絶対に私が望んでいないことです。「緑」だけを表示したいのですが。

  • さらに問題は、コントローラーで実行しようとするとUpdateModel(sampleModel)、「このオブジェクトにパラメーターなしのコンストラクターが定義されていません」というエラーが発生することです。これはおそらく、ColorsがでSelectListあり、のパラメータなしのコンストラクタがSelectListないため、バインディングを完了できないためです。

したがって、問題が何であるかは理解できたと思いますが、このシナリオには実際に良い解決策を使用できます。これは、外部キーを持つモデルオブジェクトがある場合によく発生するようです。

いくつかの質問:

  1. Colors[編集]ビューのメニューとして表示され、[詳細]ビューには単純な文字列値(「緑」など)として表示されるようにするにはどうすればよいですか?
  2. を含むモデルを更新するときに「パラメーターなしのコンストラクターがない」エラーを防ぐにはどうすればよいSelectListですか?
  3. Model / ViewModelに実際にのColorId代わりに外部キーが含まれている場合Colors、詳細ビューに現在の色の名前を表示させ、編集ビューにリストされているすべての色の名前を含むメニューを表示させるためのベストプラクティスは何でしょうか。Color私のデータベースのテーブル。それが役立つ場合は、LinqToSql(SqlMetal)を使用してモデルクラスを生成しています。
4

1 に答える 1

3

問題はすべて、SelectListをモデルプロパティとして公開しているという事実に起因しています。正確な状況に応じて、私はおそらく次のようなことをします:

  1. 3つの個別のモデルクラスを作成します。1つはLinqToSqlオブジェクト(またはそれらのラッパー)で構成される「ドメイン」モデルで、もう1つは詳細ビュー用と編集ビュー用の2つのビューモデルです。

  2. 詳細ビューモデルには、現在選択されている色の名前が含まれている必要があります。詳細アクションは、ドメインオブジェクトのFK関係を使用するか、選択した色の詳細を手動で検索することにより、このプロパティを設定します。

  3. 編集ビューモデルには、選択した色のIDのプロパティが含まれている必要があります。また、選択した値が現在選択されているIDに設定された、使用可能なカラーオプションの選択リストが含まれている必要があります。

  4. フォーム投稿を処理する編集アクションは、編集ビューモデルのインスタンスを受け入れ、それらの変更をドメインモデルにマップする必要があります。選択した色は、選択リストではなく単純なプロパティで公開されるため、検証してビジネスオブジェクトにマッピングするのは簡単です。

状況が非常に単純な場合は、ビューと編集の両方で単一のビューモデルを使用するか、ドメインオブジェクトを詳細ビューに直接渡すことができる場合があります。いずれにせよ、モデルからSelectListを削除し、選択した色を単純なIDとして公開する限り、問題はありません。

于 2010-02-15T13:59:52.740 に答える