0

まず、ここで我慢してください。フォーム データをカスタム オブジェクトに正常にマッピングするカスタム モデル バインダーがあります。このモデル バインダー内では、フォーム項目も別のカスタム オブジェクトにマップされます。私ができるはずだと感じているのは、この 2 番目のマッピングを処理する別のモデル バインダーを作成することです。これは簡易版です。

カスタム オブジェクト:

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
    public string Description { get; set; }
    public IEnumerable<SubCategory> SubCategories { get; set; }
}

public class SubCategory
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Status { get; set; }
}

フォームが SubCategories の一連の Id を返す場合、データ リポジトリに移動して SubCategory オブジェクトをハイドレートする必要があります。フォームから、サブカテゴリのリストが次の形式で送信されます。

<input type="text" name="Name" value="This Category" />

<input type="hidden" name="subcat.Index" value="0" />
<select name="subcat[0].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="1" />
<select name="subcat[1].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

<input type="hidden" name="subcat.Index" value="2" />
<select name="subcat[2].Id">
    <option value="1">Something</option>
    <option value="2">Something else</option>
</select>

カテゴリをマップするカスタムを作成するのは明らかに簡単ですが、サブカテゴリをマップするモデル バインダーを作成する (モデル バインダー内でデータ リポジトリからクエリを実行する) のは少し難しいことがわかります。

申し訳ありませんが、読んでいただきありがとうございます。これを明確にするために何か言えることがあれば教えてください。

4

2 に答える 2

5

これについての私の見解は、モデルバインダーは、リポジトリからのエンティティタイプではなく、プレゼンテーションモデルを構築する必要があるということです。モデルバインダーは、フォームのキー/値コレクションからプレゼンテーションモデルへの非常に単純なマッピングである必要があります。プレゼンテーションモデルは、ほとんどがスカラー値であり、ほとんどがスカラー値またはリストである他のタイプとの関係がある可能性があります。ご存知のように、リポジトリからエンティティインスタンスをマテリアライズする必要があると、多くの複雑さが増します。

また、不要です。プレゼンテーションモデルを使用すると、次のような多くの利点があります。

  • プレゼンテーションモデルにはこれらのフィールドのみが含まれているため、ユーザーが更新を許可されているフィールドをホワイトリストに登録する必要はありません。
  • デフォルトのモデルバインダーは、最も複雑なモデルバインディングシナリオを除くすべてで機能します。実際には、ユーザーに表示される値を条件付きで他の値にバインドする必要がある場合にのみ、カスタムモデルバインダーを使用する必要があることがわかりました。プレゼンテーションモデルを使用する場合、プレゼンテーションモデルの構造はページの構造と一致する必要があるため、構造上の理由からカスタムモデルバインダーを使用する必要はありません。
  • データベースまたはエンティティモデルを作成する前に、ビューとコントローラーを作成できます。これは、最終的なシステムを作成するために大量の作業を行う前に、設計に顧客の賛同を得ることができることを意味します。これは、エンティティモデルの構造上の問題が発生する前に整理するのに役立ちます。顧客が見たいと思うページに一致するプレゼンテーションモデルを作成し、このプレゼンテーションモデルの作成されたインスタンスを使用してページの一般的なアウトラインを作成し、それを顧客に表示するだけです。彼らが満足している場合は、リポジトリ/エンティティモデルを構築し、それをプレゼンテーションモデルにマップするためのLINQクエリを作成できます。

したがって、あなたの例では、サブカテゴリは整数のリストとしてフォームコレクションから取得されます。したがって、プレゼンテーションモデルには同じ整数のリストが必要です。コントローラでは、バインド後、メソッドを呼び出して、モデル値をプレゼンテーションモデルからリポジトリからマテリアライズドカテゴリインスタンスに転送できます。

于 2009-04-02T12:05:42.467 に答える
1

このSinging Eels の投稿を参照することをお勧めします。別のアプローチの例が示されています。サンプルの StatefulObjectBinder アプローチを使用すると、データベースから取得する必要があるビジネス オブジェクトのコレクションをバインドできます。コントローラーは IModelBinder を実装しているため、必要なオブジェクトをハイドレートしてオブジェクト コレクションに追加するために使用できるリポジトリにアクセスできます。

于 2009-04-13T15:55:24.163 に答える