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
、データを取得するために考えられるすべてのメソッドを保持する必要があります。FormsModel
Xmlは、リフレクションを使用して呼び出すことができる関数名 (場合によっては引数) にマップして、データをViewData
入力または入力ViewDataModel
することができます。
フォーム インデックスのビューHtmlHelper
は、XmlDocument
.
次に、ユーザー (または asp.net mvc) がフォームをViewData
カスタム モデル バインダーにバインドすると、現在のコントローラー値を調べて formName を探し、すべての検証ルールを保持する対応する xml を検索できます。次に、実行時に定義されたエラーModelBinder
を埋めます。ModelState
それは難しい作業ですが、成功した場合、私の見解ではそれだけの価値があります:)
David Liddleが示唆するように、モデルデータのより良い代替案を更新すると、非常に緩いデータベーススキーマになります。私はまだそれをxml(または他のシリアル化された形式)として保存し、それを使用してビューを生成し、カスタムの検証ルールを保持してModelBinder
、各フィールドのレイアウトと検証をより詳細に制御できるようにするという問題を抱えています。