2014-02-15 63 views
0

我剛剛在ASP.NET中發現了一個非常模糊的功能,它允許將控件映射到另一個控件。如果您沒有控件的源代碼,但是您想用自定義控件替換它,並且對源代碼的影響最小,這可能非常有用。本質上,它像ControlAdapter一樣工作,除了整個類型被重新映射到另一個類型。你只需要修改你的web.config文件:如何通過類型名稱引用ascx的類型?

<pages> 
     <tagMapping> 
     <add 
      tagType= 
       "System.Web.UI.WebControls.WebParts.WebPartManager" 
      mappedTagType= 
       "Microsoft.Sharepoint.WebPartPartManager, 
       MSPS.Web.dll, Version='2.0.0.0'" 
     /> 
     </tagMapping> 
    </pages> 

MSDN documentation說:

的tagMapping元素定義 在編譯時重新映射到其他標籤類型標籤類型的集合。此重新映射導致使用 映射類型代替所有頁面 的原始標記類型以及 配置文件範圍內的ASP.NET應用程序中的控件。

我能映射UserControl而不是標準控件,但我的替換UserControl不顯示。

我意識到我指的是錯誤的類型。爲了這個工作,我不得不引用ASPX類型名稱,而不是它繼承的類型。這可能是導致問題的原因,如果是這樣,我該如何找到ascx的類型?

更新: 理查德爲我提供了一個很好的線索來回答。不幸的是,我仍然留下兩個問題:

首先,儘管Richard的ClassName建議爲我的ascx提供了一致的名稱,但我替換的其他控件並未使用該屬性。我想避免與第三方代碼混淆,我不知道它會有什麼副作用。但是,如果在編譯或執行環境中不更改,我可以使用ASP.NET生成的ClassName。

其次,由於這兩個類型名稱都是在運行時生成的,而不是編譯時生成的,所以web.config怪胎聲稱它無法加載類型。

回答

0

在控件(.ascx)中使用@Control指令可用ClassName屬性定義控件的類型名稱。例如。

<%@ Control Language="VB" ClassName='MyNamespace.MyControl" %> 
+0

理查德,非常感謝您的幫助。看我的編輯。 –

+0

如果'.ascx'沒有指定類型名稱,那麼編譯'.ascx'時會生成一個。我懷疑(在運行時檢查)這將不一致。如果它是第三方代碼,則引發未指定的缺陷。 – Richard

+0

@ user148298:查看以前的評論(忘了把你的名字寫進去。) – Richard