這樣做的一種方法是創建您自己的ModelBinder
,這將是您生成的表單的核心。 modelbinder負責驗證ModelState
並重建類型爲ViewDataModel
(假設您的視圖已輸入)。
的DataAnnotations模型綁定可能是此通過Attributes
您ViewDataModel
一個很好的參考此自定義模型綁定器可以讓你做的是描述屬性的驗證(在UI呈現提示)。但是,這是所有定義的編譯時間,但是可以開始編寫自定義模型綁定器。
在你的情況下,你的模型聯編程序應該從xml文件/字符串獲得運行時字段的驗證。
如果你有這樣一個路徑:
routes.MapRoute(null, "Forms/{formName}/", new { action = "Index", controller = "Forms", formName = ""}),
然後,你可以找到正確的形式的XML FormsController.Index(string formName)
,並把它傳遞給視圖。
FormsModel
應該包含所有可能的方法來獲取數據我沒有看到任何其他方式。 Xml可以映射到函數名稱(可能是參數),您可以使用FormsModel
上的反射來調用ViewData
或輸入ViewDataModel
與數據。
窗體索引視圖可以通過HtmlHelper
擴展生成一個表單,該表單需要XmlDocument
。
然後,當您(或asp.net mvc)將您的表單綁定到您的ViewData
您的自定義模型聯編程序被調用時,它可以檢查當前控制器值以查找formName並查找相應的保存所有驗證規則的xml 。然後ModelBinder
負責填寫ModelState
任何運行時定義的錯誤。
這是一個艱鉅的任務,但是當在我看來:)
更新一個更好的替代模型數據將是一個非常鬆散的數據庫架構大衛利德爾指出被拉斷成功地值得的。我仍然經歷了將它保存爲xml(或其他序列化格式)的麻煩,並使用它來生成視圖並保存自定義的驗證規則,以便您可以更好地控制每個字段的佈局和驗證。
我反對結束這個問題。在特定的服務器端框架*上生成運行時生成的表單*的體系結構非常廣泛,但是如下面的答案所證明的,它顯然是可以回答的。所有架構問題都只是因爲架構決策是高層次的,有利有弊嗎? – 2017-08-18 18:11:13