1

以下があるとしましょう:

public enum RenderBehaviors
{
    A,
    B,
    C,
}

public class MyControl : Control
{
    public List<RenderBehaviors> Behaviors { get; set; }

    protected override void Render(HtmlTextWriter writer)
    {
        // output different markup based on behaviors that are set
    }
}

ASPX/ASCX マークアップで Behaviors プロパティを初期化することはできますか? すなわち:

<ns:MyControl runat="server" ID="ctl1" Behaviors="A,B,C" />

この場合、サブクラス化はオプションではありません (動作の実際の意図は、この例とは少し異なります)。この方法でプロパティを初期化しようとすると、WebForms はパーサー エラーを生成します。同じ質問は、他のリスト型 (int、string) にも当てはまります。

4

2 に答える 2

1

これをさらに調査した結果、WebForms が TypeConverter を見つけた場合はそれを使用することがわかりました。この関連する質問で詳しく説明されているように、型またはプロパティを適切に装飾する必要があります。

私はこれに似たものを実装しました:

public class MyControl : Control
{
    private readonly HashSet<RenderBehaviors> coll = new HashSet<RenderBehaviors>();

    public IEnumerable<RenderBehaviors> Behaviors { get { return coll; } }

    public string BehaviorsList
    {
        get { return string.Join(',', coll.Select(b => b.ToString()).ToArray()); }
        set
        {
            coll.Clear();
            foreach (var b in value.Split(',')
                .Select(s => (RenderBehvaior)Enum.Parse(typeof(RenderBehavior), s)))
            {
                coll.Add(b);
            }
        }
    }
}
于 2009-05-13T21:41:25.433 に答える
0

マークアップを操作する場合、独自の文字列プロパティの提案が唯一の解決策です。

于 2009-05-13T18:43:07.690 に答える