2009-05-13 7 views
1

Lassen Sie uns sagen, dass wir die folgende Voraussetzungen erfüllt sein:Ist es möglich, eine Eigenschaft der Steuerliste <T> in Markup zu initialisieren?

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 
    } 
} 

Ist es möglich, die Behaviors-Eigenschaft in der ASPX/ASCX Markup zu initialisieren? d.h .:

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

Subclassing ist keine Option in diesem Fall (die eigentliche Absicht des Behaviors ist etwas anders als in diesem Beispiel). WebForms generiert einen Parserfehler, wenn ich versuche, die Eigenschaft auf diese Weise zu initialisieren. Die gleiche Frage könnte auf andere Listentypen (int, strings) angewendet werden.

+0

Ich weiß, ich Behaviors als String-Eigenschaft implementieren könnte und eine benutzerdefinierte Setter habe (das wäre eine private Liste verteilen und initialisieren), aber ich frage mich, ob es gab einen saubereren Ansatz. – Jason

Antwort

1

Nachdem ich dies weiter untersucht habe, fand ich, dass WebForms einen TypeConverter verwendet, wenn er es finden kann. Der Typ oder die Eigenschaft muss ordnungsgemäß eingerichtet werden, wie in dieser related question ausführlich beschrieben.

Ich zog etwas Ähnliches wie diese Umsetzung:

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); 
      } 
     } 
    } 
} 
0

Ihr eigener Vorschlag für eine String-Eigenschaft ist die einzige Lösung beim Arbeiten mit Markup.

+0

Wissen Sie, ob WebForms die TypConverter abfragt, die registriert wurden? Wenn nicht, dann scheint es, dass der String Kludel die einzige Lösung ist, wie Sie sagten. – Jason

Verwandte Themen