2011-02-09 237 views
3

我創建了一個名爲「Actions」的內部屬性的UserControl,它是「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"">&nbsp;</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; } 
} 

如果我當時把這個代碼在我一個的DataRepeater內ASPX,它工作正常:

<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按照我的預期評估服務器表達。

我已經GOOGLE了幾個小時,但似乎無法找到其他人試圖做到這一點。任何想法,爲什麼這不工作,以及如何解決它?

感謝, 比約恩·

回答

0

我結束了對最內層的數據綁定使用標記,然後在綁定的控制中處理替換。因此,ASPX代碼如下所示:

<uc1:MyLink runat="server" Url="/"> 
    <Actions> 
     <uc1:Action Url="/Page.aspx?cpr=##cpr##&opgaveId=##id##" /> 
     <uc1:Action Url="/Test.aspx" /> 
    </Actions> 
</uc1:MyLink> 

和添加的CS這樣的代碼:

protected override void OnInit(EventArgs e) 
{ 
    DataBinding += BindData; 
} 

public void BindData(object sender, EventArgs e) 
{ 
    MyLink pl = (MyLink) sender; 
    IDataItemContainer container = (IDataItemContainer) pl.NamingContainer; 
    foreach (Action action in _actions) 
    { 
     action.Url = ReplaceTokens(action.Url, container); 
     action.Text = ReplaceTokens(action.Text, container); 
    } 
} 

private static string ReplaceTokens(string text, IDataItemContainer container) 
{ 
    Regex re = new Regex("##.*?##", RegexOptions.Compiled | RegexOptions.Singleline); 
    StringBuilder sb = new StringBuilder(text); 

    foreach (Match m in re.Matches(text)) 
    { 
     string tokenValue = DataBinder.GetPropertyValue(container.DataItem, m.Value.Substring(2, m.Value.Length - 4), "{0}"); 
     sb.Replace(m.Value, tokenValue); 
    } 
    return sb.ToString(); 
} 
0

在你的aspx設置DataRepeater.Datasource的集合或靜態或從數據庫中獲取列表...

,而不是使用的DataRepeater儘量使內部的循環列出你已經重新必須創建它,並創造新的動力作用,並且在Page_Load中或page_init

Action a; 
foreach(object x in objects) 
{ 
    a= new Action(); 
    a.Url = ... ; 
    a.Text = ... ; 
    MyLink.Actions.Add(a); 
} 

問候

+0

我不太明白你的意思了,對不起。我自己解決了,我會在這裏發佈答案。 – Bjoern