生成するフォームの中心になるModelBinder
を独自に作成する方法があります。モデルバインダーはModelState
を検証し、タイプがViewDataModel
(再入力されたと仮定します)を再構築します。
DataAnnotationsモデルバインダーは、属性の検証を説明(およびUIのレンダリングをほのめかす)あなたのViewDataModel
上Attributes
経由の良いこのカスタムmodelbinderは、あなたがすることができますどのようなこのための参照である可能性があります。しかし、これはすべてコンパイル時に定義されていますが、カスタムモデルバインダーの作成を開始するには参考になります。
モデルバインダーは、実行時にXMLファイル/文字列からフィールドの検証を取得する必要があります。
あなたのようなルートがある場合:
routes.MapRoute(null, "Forms/{formName}/", new { action = "Index", controller = "Forms", formName = ""}),
が次にあなたがFormsController.Index(string formName)
で正しいフォームXMLを見つけて、ビューに渡すことができます。
FormsModel
は、データを取得するためのすべての可能な方法を保持する必要があります。これ以外の方法はありません。 Xmlは、FormsModel
の反射を使用してViewData
を入力するか、ViewDataModel
とデータを入力して呼び出すことができる関数名(場合によっては引数)にマップできます。
フォームインデックスのビューでは、を取るHtmlHelper
拡張子を介してそのXMLからフォームを生成できます。
あなたのフォームをViewData
にバインドすると、現在のコントローラの値が検査され、formNameが検索され、すべての検証ルールが格納されている対応するxmlが検索されます。 ModelBinder
は、実行時に定義されたエラーでModelState
を埋め尽くします。
それは大変な作業だが、私の見解では、それも価値が正常に引っ張ったときに:)
更新をデビッド・リドルが示唆するように、データをモデル化するためのより良い代替は非常に緩いデータベーススキーマになります。私はまだxml(または他のシリアライズされた書式)として保存し、ビューを生成し、カスタムModelBinder
の検証規則を保持するためにそれを使用して、各フィールドのレイアウトと検証をより詳細に制御するという問題を解決します。
私はこの質問を閉じることに反対します。特定のサーバー側フレームワーク*上でランタイム生成フォーム*を作成するアーキテクチャーは広範ですが、以下の回答が証明されるにつれて明らかに対応可能です。アーキテクチャーの決定が高いレベルであり、賛否両論があるため、このサイトのすべてのアーキテクチャーに関する質問はトピックから外れていますか? –