ModelBinderこれを行う 1 つの方法は、生成されたフォームの中心となる独自のフォームを作成することです。モデルバインダーは、型付きの検証ModelStateと再構築を担当ViewDataModelします (ビューが型付きであると仮定します)。
DataAnnotationsモデル バインダーは、このカスタム モデル バインダーを使用してできることの良いリファレンスになる可能性があります。これは、属性の検証を記述する (および UI レンダリングのヒント) を介しAttributesて行うことができます。ViewDataModelただし、これはすべてコンパイル時に定義されたものですが、カスタム モデルバインダーの作成を開始するための優れたリファレンスとなります。
あなたの場合、モデルバインダーは実行時にxmlファイル/文字列からフィールドの検証を取得する必要があります。
次のようなルートがある場合:
routes.MapRoute(null, "Forms/{formName}/", new { action = "Index", controller = "Forms", formName = ""}),
次に、正しいフォーム xml を見つけてFormsController.Index(string formName)ビューに渡すことができます。
はFormsModel、データを取得するために考えられるすべてのメソッドを保持する必要があります。FormsModelXmlは、リフレクションを使用して呼び出すことができる関数名 (場合によっては引数) にマップして、データをViewData入力または入力ViewDataModelすることができます。
フォーム インデックスのビューHtmlHelperは、XmlDocument.
次に、ユーザー (または asp.net mvc) がフォームをViewDataカスタム モデル バインダーにバインドすると、現在のコントローラー値を調べて formName を探し、すべての検証ルールを保持する対応する xml を検索できます。次に、実行時に定義されたエラーModelBinderを埋めます。ModelState
それは難しい作業ですが、成功した場合、私の見解ではそれだけの価値があります:)
David Liddleが示唆するように、モデルデータのより良い代替案を更新すると、非常に緩いデータベーススキーマになります。私はまだそれをxml(または他のシリアル化された形式)として保存し、それを使用してビューを生成し、カスタムの検証ルールを保持してModelBinder、各フィールドのレイアウトと検証をより詳細に制御できるようにするという問題を抱えています。