2013-12-21 81 views
1

我有一个formview,并在它的itemtemplate里面有一个中继器。我需要从中继器中的formview访问数据项。ASP.NET嵌套数据绑定 - 访问父级数据项

像这样

<asp:FormView runat="server" ID="EvaForm" ItemType="Item1" DataKeyNames="ProfileId" EnableViewState="true"> 
    <ItemTemplate> 
    <asp:Repeater runat="server" ID="ProfileImages" ItemType="ProfileImage"> 
    <ItemTemplate> 
    <a href="<%# LinkHelpers.GetProfilePath(Item.ProfileId, >>>>ITEM1 HERE<<<<.CreateDate) & Item.ImagePath%>" onclick="return false;"> 

与EVAL一个实例用的ItemType的例子也一起将不胜感激。 所有这一切都在用户控制之内,不要认为这会产生变化。

在此先感谢

回答

2

试试这个代码:

<ItemTemplate> 
    <a href="<%# LinkHelpers.GetProfilePath(Item.ProfileId, DataBinder.Eval(Container.NamingContainer.NamingContainer, "DataItem.CreateDate").ToString()) + Item.ImagePath %>" onclick="return false;"> 
</ItemTemplate> 

或者,您也可以使用服务器控件来显示超链接和代码隐藏设置NavigateUrl属性:

<asp:Repeater runat="server" ID="ProfileImages" ItemType="ProfileImage" OnItemDataBound="ProfileImages_ItemDataBound"> 
    <ItemTemplate> 
     <asp:HyperLink runat="server" ID="ProfileLink" OnClientClick="return false;" /> 
    </ItemTemplate> 
<asp:Repeater> 

代码 - 背后:

protected void ProfileImages_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    var profileImage = (ProfileImage) e.Item.DataItem; 

    ((HyperLink) e.Item.FindControl("ProfileLink")).NavigateUrl = LinkHelpers.GetProfilePath(profileImage.ProfileId, ((Item1) EvaForm.DataItem).CreateDate.ToString()) + profileImage.ImagePath; 
} 
+0

它的工作原理!我试用了声明式.aspx代码中的第一个解决方案。 我用父/容器/命名容器进行了一些测试,但对于一些调整,我总是在控制树中结束了太多......如果我记得很清楚,那么直到主页面控件只有parent.namingcontainer(并且所有这些东西都在里面一个用户控件..)。 我想象容器引用ItemTemplate,NamingContainer到Repeater和其他NamingContainer到FormView权利? – Manight

+0

但我试图访问与ItemType的数据,而不是Eval在这种情况下,似乎不可能的权利? – Manight

+0

AFAIK,'Container'是对表示当前数据项的'RepeaterItem'实例的引用,因此它的'NamingContainer'属性引用中继器,然后引用表单视图。 – nativehr