ASP.NET MVC:使用者控制項的良好替代品?
我發現使用者控制項在使用 ASP.NET 網路表單時非常有用。通過使用標記封裝顯示控制項所需的程式碼,可重用組件的創建非常簡單且非常有用。
雖然 MVC 提供了方便的關注點分離,但這似乎破壞了封裝(即,您可以在不添加或使用其支持程式碼的情況下添加控制項,從而導致執行時錯誤)。每次向視圖添加控制項時都必須修改控制器,在我看來似乎是為了整合關注點,而不是分離它們。我寧願打破純粹的 MVC 意識形態,也不願放棄可重用的打包控制項的好處。
我需要能夠在整個站點中包含類似於 webforms 使用者控制項的組件,但不是針對整個站點,也不是在屬於母版頁的級別。這些組件應該有自己的程式碼,而不僅僅是標記(與業務層互動),如果頁面控制器不需要了解控制項,那就太好了。由於 MVC 使用者控制項沒有程式碼隱藏,因此我看不到這樣做的好方法。
最後更新 ,一個很好的(回想起來,很明顯)方法來完成這個。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace K.ObjectModel.Controls { public class TestControl : ViewUserControl { protected override void Render(System.Web.UI.HtmlTextWriter writer) { writer.Write("Hello World"); base.Render(writer); } } }創建一個繼承的新類
ViewUserControl覆蓋
.Render()如上所示的方法。就像在 webForm 中一樣,通過關聯的 ASCX 註冊控制項:
<%@ Register TagName="tn" TagPrefix="k" Src="~/Views/Navigation/LeftBar.ascx"%>在您需要的任何視圖或母版頁中使用相應的標記:
<k:tn runat="server"/>確保您的 .ascx 繼承您的新控制項:
<%@ Control Language="C#" Inherits="K.ObjectModel.Controls.TestControl" %>瞧,你已經啟動並執行了。這是使用 ASP.NET MVC 2、VS 2010 和 .NET 4.0 測試的。
您的自定義標記引用 ascx 部分視圖,該視圖繼承自 TestControl 類。然後,該控制項將覆蓋該
Render()方法,該方法被呼叫以呈現視圖,使您可以完全控制從標記到輸出的過程。使用這種方法和呼叫
Html.RenderPartial()或 `Html.RenderAction()’ 的區別在於將控制項添加到視圖是使用類似 webforms 的標籤完成的,這不僅對設計師來說更舒服,而且讓他們不必意識到控制器名稱和方法。控制項類的名稱與 ASCX 隔離,也使得將它們放入程序集中並在不同的項目中重用它們變得更容易。有人可能會說這違反了 SoC,但我相信這種方法在功能上等同於將局部視圖和控制器捆綁在一起,同時保持乾淨的標記。然而,應該清楚的是,仍然由開發人員在控制中只保留與表示相關的邏輯。業務和數據訪問邏輯仍然屬於它們各自的層。
乍一看,很容易將 MVC 視為沒有可重用組件的功能。
一旦您了解了 ASP.NET MVC,您就會發現有多種技術可用於創建豐富的控制項和組件以及封裝 MVC 的各個方面,它們遵循 與封裝 WebForms 應用程序相同的路徑。
我認為您正在做的只是查看 MVC 的 View 方面,而不是所有底層
M和C如何被封裝和捆綁在一起。Partial Views、Render Action/Partial 只是 MVC 底層組件功能的一小部分。在封面下還有更多的豐富。
我在這裡有點困惑。
首先,與 User Controls 等效的 .NET MVC 是Partial Views。部分視圖是將常用視圖功能封裝在單個位置的便捷方式。然後,您可以從另一個視圖中呼叫局部視圖。
其次,修改視圖不應該意味著也修改控制器。如果您僅僅因為您的視圖更改(而不是基礎數據)而需要對兩者進行更改,那麼沿線某處存在程式碼問題。