2012-02-26 48 views
0

我想弄清楚如何創建一個基本上是ExpandoObject的Web服務器控件。System.Dynamic ExpandoControl有可能嗎?

當在aspx標記中創建控件時,需要自動創建控件上的屬性。

例如:

<x:ExpandoControl someProperty="a value"></x:ExpandoControl> 

凡someProperty屬性尚不存在作爲控制的屬性。

我還應該提到我並不嚴格需要Control或WebControl的任何功能。我只需要能夠使用runat =「server」在標記中聲明它(它本身可能要求它是一個控件,至少這就是我的想法)。

可能嗎?如果是這樣,我該如何開始?

非常感謝。

回答

1

我覺得你的第一選擇將是實現IAttributeAccessor

public interface IAttributeAccessor 
{ 
    string GetAttribute(string key); 
    void SetAttribute(string key, string value); 
} 

的ASP.NET頁面分析程序調用IAttributeAccessor.SetAttribute每個屬性不能映射到公共財產。

因此,也許你可以用

public class ExpandoControl : Control, IAttributeAccessor 
{ 
    IDictionary<string, object> _expando = new ExpandoObject(); 

    public dynamic Expando 
    { 
     { 
      return _expando; 
     } 
    } 

    void IAttributeAccessor.SetValue(string key, string value) 
    { 
     _expando[key] = value; 
    } 

    string IAttributeAccessor.GetValue(string key) 
    { 
     object value; 
     if (_expando.TryGetValue(key, out value) && value != null) 
      return value.ToString(); 
     else 
      return null; 
    } 
} 
+0

輝煌的開始!我確實還記得很久以前閱讀過這個界面,但已經忘記了它。我想你是正確的。它可能完全按照我需要的方式工作。非常感謝你的幫助。我會在今晚晚些時候有機會試用它時將其更新爲已接受的答案。 – ChrisS 2012-02-26 21:54:15

+0

這確實有效。唯一的限制是這個值必須是字符串值,但是現在需要做一些狡猾的序列化和反序列化。 – ChrisS 2012-02-26 22:27:09