Asp.net

ASP.NET MVC - 如何實現可重用的使用者控制項並保持 DRY?

  • February 25, 2013

第一次發帖,請溫柔:)

在 ASP.NET MVC 中創建使用者控制項時,構造程式碼的最佳方式是什麼,以便呼叫使用使用者控制項的視圖的控制器不必對控制項了解太多?我想知道在 ASP.NET MVC 中使用使用者控制項時保持 DRY 的好方法。

請注意,此問題僅適用於在回發時需要特殊處理和邏輯的使用者控制項。我可以為僅查看(使用 RenderPartial)或需要一些預處理以創建適當的 ViewModel(使用 RenderAction)的使用者控制項創建漂亮的 DRY 程式碼。

此外,此問題僅與在應用程序中實現可重用控制項有關。在這一點上,我並不擔心應用程序之間的可重用性。

舉一個具體的例子,假設我想創建一個“快速添加”使用者控制項,其中包含三個輸入欄位,名字、姓氏和公司名稱以及一個送出按鈕。使用 QuickAdd 功能時,應獨立於控制項所在的頁面執行以下步驟:

  1. 驗證欄位是否為空,如果是,則顯示一個指示符。
  2. 執行對儲存庫的查找以查看公司是否已經存在,如果不存在;創造它。
  3. 創建與現有公司或新創建的公司關聯的新聯繫人
  4. 重新渲染現有頁面。如果沒有驗證錯誤,使用者將再次看到完全相同的頁面,否則會出現驗證錯誤的相同頁面。

我實現 DRY 的主要問題與呼叫包含部分視圖的視圖的所有控制器最終必須有一個操作方法來處理來自快速添加的表單送出有關。即使我將處理資訊的邏輯分解到一個單獨的控制器中,並從其他每個控制器呼叫該方法,但呼叫具有可重用控制項的視圖的每個控制器都必須具備這些知識,這似乎是一種負擔。

我查看的另一個選項是讓可重用控制項始終送出給特定的操作方法/控制器,但是該控制器無法知道如何為呼叫包含視圖的特定控制器適當地重新填充模型可重用控制項(在步驟 4 中)。

我知道 MVC 2 中有關於子控制器的討論(來自這個問題ASP.NET MVC - Contained User Controls),但由於它還沒有,在保持 DRY 的同時建構程式碼以實現最大可重用性的最佳方法是什麼?

是否必須讓所有控制器呼叫使用可重用控制項的視圖(具有上述控制項的特徵),必須有一個操作方法來處理來自控制項的資訊?

在您的文章末尾,您問“是否必須擁有所有控制器……必須有一個動作方法來處理來自控制項的資訊

該問題的答案是編寫自定義模型綁定器。您的自定義模型綁定器可以負責將傳入表單控制項的值填充到所有控制器使用的模型或屬性中。通常,您希望將驗證與模型綁定分開,但也沒有理由不能將它們結合起來。

我強烈推薦6 Tips for ASP.NET MVC Model Binding來更深入地討論該主題以及一些很好的參考資料。

引用自:https://stackoverflow.com/questions/1983331