Я создал UserControl с внутренним свойством, называемым «Actions», который представляет собой список объектов «Action». Код выглядит следующим образом:ASP.Net атрибуты привязки внутреннего свойства настраиваемого элемента управления
[ParseChildren(true)]
public class MyLink : UserControl
{
readonly List<Action> _actions = new List<Action>();
[PersistenceMode(PersistenceMode.InnerProperty)]
public List<Action> Actions
{
get { return _actions; }
}
public string Text { get;set; }
public string Url { get;set; }
public string MenuName { get; set; }
protected override void Render(HtmlTextWriter writer)
{
//Build link
StringBuilder sb = new StringBuilder();
sb.Append(@"
<table class=""myLink"">
<tr>
<td class=""myLinkLeft""><a href=" + Url + @">" + Text + @"</a></td>
<td class=""myLinkRight " + MenuName + @"_trigger""> </td>
</tr>
</table>
");
//Build actions
sb.Append("<ul id=\"" + MenuName + "_actions\" class=\"contextMenu\">");
foreach (Action action in _actions)
{
sb.Append("<li class=\"" + action.CssClass + "\"><a href=\"#" + action.Url + "\">" + action.Text + "</a></li>");
}
sb.Append("</ul>");
writer.Write(sb.ToString());
}
}
public class Action : UserControl
{
public string Url { get; set; }
public string Text { get; set; }
public string ImageUrl { get; set; }
public string CssClass { get; set; }
}
Если я затем поместить этот код в моем ASPX внутри DataRepeater, он отлично работает:
<uc1:MyLink runat="server" Url="/" Text='<%#DataBinder.Eval(Container.DataItem,"Text") %>' MenuName="contextMenu" id="contextMenu">
<Actions>
<uc1:Action runat="server" Url="http://mysite.com" Text="MyUrl" />
<uc1:Action runat="server" Url="http://google.com" Text="Google" />
</Actions>
</uc1:MyLink>
Однако, если я пытаюсь связать данные с атрибутами Действие таких элементов, как так:
<uc1:MyLink runat="server" Url="/" Text='<%#DataBinder.Eval(Container.DataItem,"Text") %>' MenuName="contextMenu" id="contextMenu">
<Actions>
<uc1:Action runat="server" Url='<%#DataBinder.Eval(((RepeaterItem)Container.Parent).DataItem,"Url") %>' Text="MyUrl" />
<uc1:Action runat="server" Url="http://google.com" Text="Google" />
</Actions>
</uc1:MyLink>
Я просто получить фактический текст "<% # DataBinder.Eval (((RepeaterItem) Container.Parent) .DataItem," URL ")%>", присвоенные свойству Url, а не e как я и ожидал.
Я искал это в течение нескольких часов, но, похоже, не может найти кого-то другого, пытающегося это сделать. Любые идеи, почему это не работает и как обойти это?
Спасибо, Бьорна
Я не совсем уверен, что я понимаю, что вы имеете в виду, извините. Я решил это сам, и я отправлю ответ здесь. – Bjoern