É possível inicializar uma Lista de Controle propriedade na marcação?
-
21-08-2019 - |
Pergunta
Vamos dizer que nós temos o seguinte:
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
}
}
É possível inicializar a propriedade Comportamentos na ASPX / ASCX marcação? ou seja:.
<ns:MyControl runat="server" ID="ctl1" Behaviors="A,B,C" />
Subclassing não é uma opção neste caso (a intenção real dos comportamentos é ligeiramente diferente do que neste exemplo). WebForms gera um erro de interpretação quando eu tento inicializar a propriedade desta forma. A mesma pergunta poderia ser aplicada a outros tipos de lista (int, cordas).
Solução
Depois de pesquisar isso ainda mais, descobri que WebForms usa um TypeConverter se pode encontrá-lo. O tipo ou as necessidades de propriedade a ser decorado adequadamente, conforme detalhado neste pergunta relacionada .
acabei implementar algo semelhante a isto:
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);
}
}
}
}
Outras dicas
A sua própria sugestão de uma propriedade string é a única solução quando se trabalha com marcação.