2010-02-19 23 views
1

我有一個UserControl(可以說Foo.ascx),它有一個名爲Bar的Type public屬性。 我正在尋找一種方式,當我在標記部分的源視圖中聲明此用戶控件來傳遞一個類型。例如如何傳遞一個類型到一個UserControl

<%@ Register Src="~/Controls/Foo.ascx" TagPrefix="prfx" TagName="fooCtrl" %> 

,然後用它作爲

<prfx:fooCtrl ID="theId" runat="server" /> 

如果例如我想傳遞給控制,將有此效果的類型字符串(如typeof運算(字符串)) 東西

<prfx:fooCtrl ID="theId" runat="server" Bar="typeof(string)" /> 

怎麼辦? 之前有人問,原因是,我有這個用戶控件中的許多其他屬性,我通過這種方式,我想避免使用CodeBehind只是通過類型

回答

1

簡短的回答,你不能這樣做。編輯器和編譯器將.ascx文件視爲(最終)XML。這意味着在「反序列化」屬性可以轉換爲各種基本類型,但不是複雜的類型,如System.Type。爲了工作,在編譯過程中,你想要做的事情需要在xml文檔中的某個屬性不被視爲文本,而不是轉換爲簡單類型,而是作爲代碼來解釋和執行。在不改變Visual Studio和ASP.NET編譯器的工作原理的情況下,這不會發生。


解決方法:

  1. 在你的用戶控件創建string類型的公共屬性
  2. 傳給你希望通過這個屬性
  3. 使用傳遞給用戶控件的類型的AssemblyQualifiedNameGetType(string)重載在代碼中獲取此類型的實例。

    < prfx:fooCtrl ID = 「theId」 RUNAT = 「服務器」 酒吧= 「System.String,mscorlib程序,版本= 2.0.0.0,文化=中性公鑰= b77a5c561934e089」/>

,並在代碼:

/* ... */ 
var barType = Type.GetType(this.Bar); 
// do whatever you want with this type 
+0

查看我對Anders Fjeldstad的回答的評論 – Jaguar

+0

@jag不會發生。 XML是一個不同的野獸,這是XML。將智能感知添加到xml文檔的唯一方法是使用XSD,這在您的情況下不起作用。絕對沒有辦法將智能感知添加到此選項中(無需爲Visual Studio編寫擴展)。 – Will

+0

@jag你不明白代碼和文本之間的區別,以及VS如何處理它們。你也不明白在VS中使用的編輯器類型之間的區別。我在這一個上沒有犯任何錯誤。感謝參與。 – Will

2

你可以字符串類型的屬性添加到您的打了個比方類型名用戶控制:

public string TypeName { get; set; } // Validation omitted for brevity 

然後改變你的酒吧財產的執行:

public Type Bar { get { return Type.GetType(TypeName); } } 

這樣,你可以寫:

<prfx:fooCtrl ID="theId" runat="server" Bar="System.String" /> 

有需要使用呼叫類型的酒吧屬性的所有代碼。

+0

這就是我現在正在做的,我正在尋找一種編譯安全的方法,此外,我說我想避免代碼隱藏 – Jaguar

+0

標記是文本,因此將很難傳遞一個複雜的對象,如類型和讓它自動實例化而不觸及代碼隱藏。 –

+0

如果我設置了布爾屬性,智能感知將檢查「true」或「false」。我正在尋找相同的功能,但與Type類型。 – Jaguar

相關問題