我的转发器asp控件有问题。
我的数据库上有一个名为course的表,其中包含CourseID,CourseName,CourseLink和另一个名为module的表,其中包含ModuleID,ModuleName列。还有另一个名为时间表的表,其中包含CourseID和ModuleID列。
这种方式的工作方式是当我点击HyperLink1时,该段落与相同的课程ID相同,它会将段落的样式显示从隐藏更改为显示(我使用JavaScript来完成此功能,所以它&# 39;这不是问题。)
我想知道的是,如何列出与该特定课程ID相关的ModuleNames。
我在考虑在转发器中使用另一个转发器。然而,这只会让事情变得复杂,并且让人感到困惑。
我怎样才能让它工作,不用处理sql,因为我很乐意创建一个select命令。
这是ASP.NET论坛。
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="DataSource1">
<ItemTemplate>
<p>
<a id="HyperLink1" runat="server" href='<%# Eval("courselink") %>'>
<%# Eval("CourseName") %>
</a> <br />
</p>
<p id='<%# Eval("CourseID") %>' style="display:none">
<%# Eval("ModulName") %>
</p>
<br />
</ItemTemplate>
</asp:Repeater>
感谢您的时间,我期待着找到解决此问题的方法。
答案 0 :(得分:1)
你几乎需要使用另一个转发器,这个技巧(如果我没记错的话,我自2011年以来就没有使用过旧的ASP.NET Web Forms)是你加入了ItemDataBound事件在您的代码后面为父转发器,然后使用事件参数来获取您与子表关联的ID,获取该数据,通过来自Repeater的id查找转发器(我认为它&#39 ; s发送者,但有一些方法来获取它)并绑定数据。
我想要注意ASP.NET MVC更容易和更清晰,并且通常不鼓励使用ASP.NET Web Forms。
答案 1 :(得分:1)
这可能是最糟糕的方式
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="DataSource1">
<ItemTemplate>
<p>
<a id="HyperLink1" runat="server" href='<%# Eval("courselink") %>'>
<%# Eval("CourseName") %>
</a> <br />
</p>
<p id='<%# Eval("CourseID") %>' style="display:none">
<%# moduleName(Eval("id").ToString()) %>
</p>
<br />
</ItemTemplate>
public string moduleName(string id)
{
string returnValue = "<ul>";
using (SqlConnection con = new SqlConnection(DB))
{
using (SqlCommand com = new SqlCommand("SELECT * FROM module WHERE id = @id", con))
{
com.Parameters.AddWithValue("@id", id);
if (con.State == System.Data.ConnectionState.Closed)
{
con.Open();
using (SqlDataReader dr = com.ExecuteReader())
{
while (dr.Read())
{
returnValue += "<li>"+ dr["modulename"].ToString()+"</li>";
}
}
con.Close();
}
}
}
returnValue += "</ul>";
return returnValue;
}
答案 2 :(得分:1)
最好的解决方案是为您的演示文稿创建强类型模型,不要使用Eval,您可以在webform中获得类似的内容:
<asp:Repeater runat="server" DataSourceID="<%# Model %>">
<ItemTemplate>
<p>
<a href="<%# ((Course)Container.DataItem).Link %>"><%# ((Course)Container.DataItem).Name %></a>
</p>
<p id='<%# ((Course)Container.DataItem).ID %>' style="display:none">
<asp:Repeater runat="server" DataSource="<%# ((Course)Container.DataItem).Modules %>">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li><%# ((Module)Container.DataItem).Name %></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</p>
</ItemTemplate>
然后在你的代码后面创建以下属性:
public List<Course> Model
{
get
{
List<Course> courses = new List<Course>();
// Some example data, in your situation you should instantiate the classes based on the data from the database.
Course exampleCourse = new Course();
exampleCourse.ID = 1;
exampleCourse.Name = "Example course";
// Create example module 1
Module exampleModule1 = new Module();
exampleModule1.ID = 10;
exampleModule1.Name = "Example Module 1";
// Create example module 2
Module exampleModule2 = new Module();
exampleModule2.ID = 11;
exampleModule2.Name = "Example Module 2";
// add modules to the course
exampleCourse.Modules.Add(exampleModule1);
exampleCourse.Modules.Add(exampleModule2);
// add course to the courses
courses.Add(exampleCourse);
return courses;
}
}
需要的课程:
public class Course
{
public int ID { get; set; }
public string Link { get; set; }
public string Name { get; set; }
public List<Module> Modules { get; set; }
public Course()
{
this.Modules = new List<Module>();
}
}
public class Module
{
public int ID { get; set; }
public string Name { get; set; }
}
最后,在你的页面加载中,不要忘记数据绑定:
protected void Page_Load(object sender, EventArgs e)
{
this.DataBind();
}