2011-11-09 14 views
1

私はasp.netでカスタムWebサーバーコントロールを作成しました。私は、RenderContentsメソッドでクラスのListをレンダリングしようとしています。ここで'System.Collections.Generic.List'のオブジェクトを、 ''プロパティの文字列表現 '(Collection)'から作成できません。

は私のコードです:すべての

[DefaultProperty("Items")] 
[ToolboxData("<{0}:News runat=server></{0}:News>")] 
public class News : WebControl 
{ 

    [Bindable(true)] 
    [Category("Appearance")] 
    [DefaultValue("")] 
    [Localizable(true)] 
    public List<NewsItem> Items 
    { 
    get 
    { 
    List<NewsItem> items = (List<NewsItem>)(ViewState["Items"] == null ? new List<NewsItem>(): ViewState["Items"]); 
    return items; 
    } 

    set 
    { 
    ViewState["Items"] = value; 
    } 
    } 

    protected override void RenderContents(HtmlTextWriter output) 
    { 
    foreach (var item in Items) 
    item.RenderControl(output); 

    } 
} 

まず、私はページ上にこのコントロールをドラッグ&ドロップするとき、私はデザイン時にプロパティウィンドウからItemsプロパティにアクセスすることができます。

は、ここでのASPXコードです:

<Aram:News ID="News1" runat="server" /> 

私は(それがコレクションであると言って値が表示されている)のアイテムを変更した後、私は、デザインビュー上の任意の更新情報が表示されません。

そして、私は[OK]をクリックし、デバッグを開始した後、私はエラーを取得:私は私のコントロールのASPXコードを振り返ることを今

Cannot create an object of type 'System.Collections.Generic.List`1[[AramWebControls.NewsItem, Custom Web Server Control, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' from its string representation '(Collection)' for the 'Items' property. 

は、それが(コレクション」に設定され、そのItemsプロパティを持っています) '。

<Aram:News ID="News1" runat="server" Items="(Collection)" /> 

これを解決するには?私は自分のコントロールがコンテンツとしてListコントロールを持っているはずです。

ご協力いただければ幸いです。

ありがとうございました。

+0

これは、 'Items ="(Collection) "という意味ですか?明示的に "Collection"文字列が設定されている場合、またはここにプロパティへのデータバインディングがありますか? – sll

+0

@sll私はaspxコードに触れません。プロパティウィンドウからデザインタイムプロパティを更新するだけで、いくつかのアイテムを追加できます。私が終わったら、それだけでそれを示しています。また、プロパティウィンドウから 'Items'プロパティをクリックすると、追加されたアイテムは表示されません。それはもう一度空です。前にカスタムWebコントロールを設計したことがありますか? –

答えて

0

この問題の解決策が見つかりました。 まず、ItemsはList型であり、それはコレクションです。 Newsコントロールタグの中に永続化することはできません。だから、ニュースコントロールタグの内容の一部でなければならない。これは、カスタムビューステート管理を必要とします。

詳細については、先にWeb Control Collection Property Example を参照してから、アイテムを処理するLoadViewState、SaveViewState、およびTrackViewStateをオーバーライドする必要があります。これについての詳細はServer Control Properties Example

0

私のASP.netプロジェクトのデザイナーにも同様のエラーがありました。コードは、構築し、細かい動作しますが、デザイナーは、次のエラーが表示されます。

Error Creating Control - [ServerControlNameOmitted] Cannot create an object of type 'System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' from its string representation '(Collection)' for the 'CustomProperties' property. 

私は以前にサーバーコントロールのコードに関連するプロパティにこの属性を持っていた:

[Browsable(false)] 
public Dictionary<string, object> customProperties { get; set; } 

それを修正するために、私はそれを変更しましたこれは:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
public Dictionary<string, object> customProperties { get; set; } 

私はポストバックの間にcustomPropertiesを維持しようとしていないことに注意してください。

関連する問題