在 ASP.NET MVC 中使用動態表單的建議
我正在努力在滿足這些要求的 ASP.NET MVC 視圖中呈現動態表單:
- 可以驗證欄位
- 當表單無效時狀態被保留
我正在研究創建一個自定義模型綁定器來實現這一點。我一般打算這樣做:
- 表單欄位是使用這些屬性定義的
提示(欄位旁邊的標籤)
類型(文本、複選框列表、單選列表等)
選項(用於列表欄位)
是必須的
正則表達式(用於文本欄位)
顯示選項
欄位定義的集合從控制器發送到視圖
欄位被渲染成 HTML 並發送到瀏覽器
表單被發送回伺服器
自定義模型綁定器將表單綁定到現在包含送出值的欄位定義集合
每個欄位都經過驗證
如果需要 -> 必須有一個值
如果 RegEx -> 必須匹配
對於每個無效欄位,都會在 modelstate 中添加一條錯誤消息
控制器決定做什麼
如果所有欄位都有效
- 對欄位及其值做任何事情
如果 1 個或多個欄位無效
- 將欄位集合發送回視圖
- 使用之前嘗試的值再次渲染欄位
- 顯示驗證摘要
我不確定我是否以最好或最簡單的方式這樣做。這種方法會給我帶來很多問題甚至是工作嗎?我能做些什麼來改進它?
我寫了一個類庫,它基本上完全按照我的問題中的虛擬碼描述的那樣做。它工作得很好。
編輯:
我終於開始清理我的類庫了。我添加了一些新功能並創建了一個文件齊全的展示 Web 應用程序。
所有這些都託管在 CodePlex 上。我希望這可以幫助別人。
我絕不是專家,但如果您對 ASP.NET MVC 非常陌生,那麼我建議您先從內置功能開始,然後再自行開發。它完成了您所描述的大部分工作,除了不鼓勵在控制器中定義/構造 UI,因為這是視圖的工作。
通過 ModelStateDictionary,您可以添加模型錯誤並設置模型值,然後在驗證失敗時將其綁定到您的表單輸入。
**更新:**另一種看待它的方式:問問自己為什麼要使用 MVC 而不是經典的 ASP.NET 構造技術,然後看看您提出的方法是否符合這些原因。對我來說,關注點分離是一個重要的原因,以及對生成的 HTML 的精細控制,我覺得你的方法可能會顛覆這些東西。
要專門解決您的編輯:
第 1 步到第 1 步是違反 MVC 範式的。第四步,好。步驟 5 到 7 幾乎是標準的 MVC 實踐,並得到框架的完全支持。例如,Performing Simple Validation (C#)顯示了驗證和錯誤消息顯示的範例。