C# 从一个<;李>;元素,位于Literal.text字符串内

C# 从一个<;李>;元素,位于Literal.text字符串内,c#,asp.net,C#,Asp.net,我遇到以下问题:每当单击特定的li时,我想调用一个方法。问题是,li是在literal.text字符串中动态创建的,我从数据库中导入内容。 每当我尝试调用一个方法时,它都不起作用。每当用户单击每个li时,我想调用一个方法,并在我的方法中获得li信息(尚未编写方法代码,因为我无法调用它) 想法 protected void Page_Load(object sender, EventArgs e) { string conString = "Provider=Microsoft.ACE.O

我遇到以下问题:每当单击特定的
li
时,我想调用一个方法。问题是,
li
是在
literal.text
字符串中动态创建的,我从数据库中导入内容。 每当我尝试调用一个方法时,它都不起作用。每当用户单击每个
li
时,我想调用一个方法,并在我的方法中获得
li
信息(尚未编写方法代码,因为我无法调用它) 想法

protected void Page_Load(object sender, EventArgs e)
{
    string conString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source="
       + Server.MapPath("~/ebookstoredb.mdb");

    using (OleDbConnection con = new OleDbConnection(conString))
    {
        con.Open();
        string query = "SELECT * FROM CATEGORY";

        using (OleDbCommand cmd = new OleDbCommand(query, con))
        {
            OleDbDataReader reader = cmd.ExecuteReader();
            String msg = "";
            while (reader.Read())
            {
                lit1.Text += "<ul>" + "<li runat=\"server\" OnClick=\"ProductsInfo\">" + reader["ID"]
                    + "," + reader["Name"]
                    + "</li>"
                    + "</ul>";
            }
            reader.Close();
        }
        con.Close();
    }
}
protected void ProductsInfo(object sender, EventArgs e)
{
    Response.Redirect("Default.aspx");
}
受保护的无效页面加载(对象发送方,事件参数e)
{
string conString=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=”
+Server.MapPath(“~/ebookstoredb.mdb”);
使用(OLEDB连接con=新OLEDB连接(构造))
{
con.Open();
string query=“从类别中选择*”;
使用(OleDbCommand cmd=new-OleDbCommand(query,con))
{
OleDbDataReader=cmd.ExecuteReader();
字符串msg=“”;
while(reader.Read())
{
lit1.Text+=“
    ”+“
  • “+阅读器[“ID”] +“,”+读卡器[“名称”] +“
  • ” +“
”; } reader.Close(); } con.Close(); } } 受保护的无效产品信息(对象发送方、事件参数e) { 重定向(“Default.aspx”); }
我以前从未使用过文字,但通过阅读有关文字的内容。。。对于只显示静态html的文本,您需要让每个li调用一个javascript函数,然后该函数将回发到您想要的方法。因此,像这样构建您的
li

 lit1.Text += "<ul><li><a onclick=\"CallProductInfo(" + reader["ID"]+ ")\">" + reader["ID"]
                    + "," + reader["Name"]
              + "</a></li></ul>";
if (Request["__EVENTTARGET"] == "ProductInfoId")
        {
            ProductInfo(Convert.ToInt64(Request["__EVENTARGUMENT"]));
        }

我以前从未使用过文字,但从阅读中。。。对于只显示静态html的文本,您需要让每个li调用一个javascript函数,然后该函数将回发到您想要的方法。因此,像这样构建您的
li

 lit1.Text += "<ul><li><a onclick=\"CallProductInfo(" + reader["ID"]+ ")\">" + reader["ID"]
                    + "," + reader["Name"]
              + "</a></li></ul>";
if (Request["__EVENTTARGET"] == "ProductInfoId")
        {
            ProductInfo(Convert.ToInt64(Request["__EVENTARGUMENT"]));
        }

不幸的是,您无法在文本控件上创建服务器端事件

但是,您可以添加客户端javascript功能来回发请求

在您的aspx中使用:

<div>
    <asp:Literal runat="server" ID="lit1"></asp:Literal>
</div>

您的aspx.cs应包含:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                lit1.Text += "<ul>" + "<li \' onclick=\'javascript: __doPostBack(\"getProduct\", \"1\");\'>"
                             + "Product " + "1"
                             + "</li>"
                             + "</ul>";
            }
            if (Request.Form["__EVENTTARGET"] != null && Request.Form["__EVENTTARGET"] == "getProduct")
            {
                getProduct_Click(null, null);
            }
        }

        private void getProduct_Click(object sender, System.EventArgs e)
        {
            Response.Write("You Clicked on " + Request.Form["__EVENTARGUMENT"]);
        }
受保护的无效页面加载(对象发送方,事件参数e)
{
如果(!Page.IsPostBack)
{

lit1.Text+=“
    ”+“很遗憾,您无法在文本控件上创建服务器端事件

    但是,您可以添加客户端javascript功能来回发请求

    在您的aspx中使用:

    <div>
        <asp:Literal runat="server" ID="lit1"></asp:Literal>
    </div>
    
    
    
    您的aspx.cs应包含:

    protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    lit1.Text += "<ul>" + "<li \' onclick=\'javascript: __doPostBack(\"getProduct\", \"1\");\'>"
                                 + "Product " + "1"
                                 + "</li>"
                                 + "</ul>";
                }
                if (Request.Form["__EVENTTARGET"] != null && Request.Form["__EVENTTARGET"] == "getProduct")
                {
                    getProduct_Click(null, null);
                }
            }
    
            private void getProduct_Click(object sender, System.EventArgs e)
            {
                Response.Write("You Clicked on " + Request.Form["__EVENTARGUMENT"]);
            }
    
    受保护的无效页面加载(对象发送方,事件参数e)
    {
    如果(!Page.IsPostBack)
    {
    
    lit1.Text+=“
      ”+“好了,伙计们,我发现了问题所在。我们的genious老师今天告诉我们,我们可以使用数据网格。唉。
      谢谢大家的回复!

      好了,伙计们,我发现了问题所在。我们的genious老师今天告诉我们,我们可以使用datagrid。唉。
      谢谢大家的回复!

      为什么不使用控件而不是文字呢?@DStanley这是我大学课堂上的练习。我被要求用文字来练习!{sigh}你一定很喜欢那些教人们以错误的方式做事的学校……那么他们教你如何添加点击处理程序了吗?@DimitrisHD我认为你的老师并不像你所描述的那样使用文字。问题是li标记是动态添加的,所以客户端html不能调用
      ProductsInfo()
      event,除非您将ProductsInfo设置为。这会增加代码的复杂性。@DimitrisHD抱歉,我给了您错误的方法。我所做的几乎是重复您的问题……为什么不使用控件而不是文本?@DStanley这是我大学课堂上的练习。我被要求使用文本来完成它!{叹气}你一定很喜欢那些教人们以错误的方式做事的学校……那么他们教你如何添加点击处理程序了吗?@DimitrisHD我认为你的老师并不像你所描述的那样使用文字。问题是li标记是动态添加的,所以客户端html不能调用
      ProductsInfo()
      event,除非您将ProductsInfo设置为。这会增加代码的复杂性。@DimitrisHD抱歉,我给了您错误的方法。我所做的几乎是重复您的问题……请您完成这项工作好吗?您真的需要回发到代码中的方法,还是只需重定向到将显示inf的某个页面o对于那个特定的产品id?我想显示每个类别的所有项目,所以是的,我需要一个方法,该方法对上面的代码执行类似的操作,但对于产品(显示单击的类别中的所有产品)我认为类似于我上面提到的东西会起作用。关键是因为文本只显示静态html(尽管我从未使用过文本),您必须调用javascript客户端函数。然后,如果您真的想保持在同一页面上,javascript必须执行回发。回发时,代码必须区分您使用产品id进行的回发,并转到正确的方法。由于这不是对事件处理程序的正确回发,因此您必须执行EVENTTARGET和EVENTARGUMENT之类的东西。虽然这在技术上可能有效,但我高度怀疑分配的目的是重新创建客户端回发代码。请完成这项任务好吗?您真的需要回发到代码中的某个方法,还是只重定向到某个页面,该页面将显示特定产品id的信息?我想要要显示每个类别的所有项目,所以是的,我需要一个方法,该方法对上面的代码执行类似的操作,但对于产品(显示单击的类别中的所有产品),我认为类似于我上面所述的操作会起作用。关键是因为文本显示静态html