Asp.net 嵌入式中继器的处理深度
我有一个设计问题。我有一个嵌套的中继器结构,它有4层深。中继器显示被视为第1-4节的数据。这些部分都在数据库中与工作描述相关联 我想在中继器最深层的每个项目中添加一个编辑按钮。然而,中继器的深度并非都相等。一份工作描述可以有多个条目用于第1-4节,因此需要转发器。然而,如前所述,一个给定的区段条目可能是1-3。。。然后1-4。。。也许只是第一部分 另一个使这个问题变得棘手的先决条件是,它被设计为一次只绑定到一个层。然后,他们单击一个向下搜索img按钮,该按钮将下一组数据绑定到内部中继器。因此,这比简单地计算绑定到它的次数更加困难 所以我的问题是,我可以使用什么编程结构来相对快速地推断给定条目的深度?显然,考虑到我有一个截止日期,一个不需要额外大量时间的解决方案将是令人惊讶的 下面是表格结构。记住,它是不可改变的。那是在更多的时间之前Asp.net 嵌入式中继器的处理深度,asp.net,stored-procedures,Asp.net,Stored Procedures,我有一个设计问题。我有一个嵌套的中继器结构,它有4层深。中继器显示被视为第1-4节的数据。这些部分都在数据库中与工作描述相关联 我想在中继器最深层的每个项目中添加一个编辑按钮。然而,中继器的深度并非都相等。一份工作描述可以有多个条目用于第1-4节,因此需要转发器。然而,如前所述,一个给定的区段条目可能是1-3。。。然后1-4。。。也许只是第一部分 另一个使这个问题变得棘手的先决条件是,它被设计为一次只绑定到一个层。然后,他们单击一个向下搜索img按钮,该按钮将下一组数据绑定到内部中继器。因此,这
Table FK PK
Section1 | JobID | Sect1ID |
Section2 | Sect1ID | Sect2ID |
Section3 | Sect2ID | Sect3ID |
Section4 | Sect3ID | Sect4ID |
中继器结构
<Repeater 1>
<Section 1 Data>
<Repeater 2>
<Section 2 Data>
<Repeater 3>
<Section 3 Data>
<Repeater 4>
<Section 4 Data>
</Repeater>
</Repeater>
</Repeater>
</Repeater>
我的一些想法
创建计算条目深度的存储过程。传入SectID并返回相对于SectID的深度。我已经有了一个结构,可以通过一个隐藏的asp:标签按节ID标识每个单独的转发器项
维护一个字典,将一个部分映射到它的深度。利用存储过程。但是,只有在钻取项目时才可以输入。这样做是轻量级的,我只跟踪用户感兴趣的项目
每次用户向下钻取时,检查深度是否相等。。。如果是,则显示编辑img按钮,如果不是,则在字典中钻取并增加值
他们对我的解决方案还有其他想法或问题吗?答案其实很直截了当。执行所有这些跟踪充其量是一种笨拙的方法。解决方案要简单得多。我不是最熟练的存储过程编写者,所以请容忍我在这方面的错误。如果有人想展示一个更易于维护和整洁的版本,那就太棒了 解决方案是创建一组存储过程,以查看与其相关联的下一节记录
bit doesSection2RecordExist(int prevSectID)
bit doesSection3RecordExist(int prevSectID)
bit doesSection4RecordExist(int prevSectID)
这些都返回一个位,即SP名称所隐含的语句的真或假
现在只需将这些绑定到一个整洁的方法中,请记住,我的公司正在使用一种模式方法,因此对于某些人来说,db访问代码可能有些陌生,但db访问实现细节并不是您需要关注的依赖性
public enum SectionType { First, Second, Third, Fourth };
public static bool HasNextSection(int prevSectID, SectionType sectNum)
{
if (sectNum > SectionType.First)
{
var procName = "Section" + (int)sectNum + "RecordExists";
using (var ov = new OneValue(Product.SafetyObs, procName))
{
ov["PrevSectID"] = prevSectID;
return ov.Value.Bool;
}
}
return false;
}
最后一步是在适当的时间拨打电话,检查是否有另一条记录。这是在中继器的OnBound事件中完成的
另一个注意事项是,我使获取正确的前一节ID变得更加简单。在绑定期间,我将其存储在标签中的每一层,并使其不可见
protected void rptrSection1_Bound(object sender, RepeaterItemEventArgs e)
{
var lblID = e.Item.FindControl("lblSection1Id") as Label;
var sectID = int.Parse(lblID.Text);
if (!SectionLoader.HasNextSection(sectID, SectionType.Second))
{
//things to do if there are no sections left
}
else
{
//things to do if there are sections left
}
return;
}
然后我用所有的内部中继器2-4重复这一点
我希望这对将来遇到类似情况的人有所帮助