Можно ли инициализировать свойство List<T> элемента управления в разметке?
-
21-08-2019 - |
Вопрос
Допустим, у нас есть следующее:
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
}
}
Можно ли инициализировать свойство Behaviors в разметке ASPX/ASCX?то есть:
<ns:MyControl runat="server" ID="ctl1" Behaviors="A,B,C" />
В этом случае создание подклассов недопустимо (фактическое назначение поведений немного отличается от этого примера).WebForms генерирует ошибку синтаксического анализатора, когда я пытаюсь инициализировать свойство таким образом.Тот же вопрос можно применить и к другим типам списков (int, строки).
Решение
Изучив это дальше, я обнаружил, что 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);
}
}
}
}
Другие советы
Ваше собственное предложение строкового свойства — единственное решение при работе с разметкой.