从Literal.text字符串中的<li>元素调用方法

时间:2017-01-11 20:55:36

标签: c# asp.net

我遇到以下问题:我想在点击特定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");
}

3 个答案:

答案 0 :(得分:1)

我以前从未使用过文字,但是从阅读它们开始......用文字只显示静态html,你需要让每个li调用一个javascript函数,然后回复你想要的方法。所以建立你的li就像这样:

 lit1.Text += "<ul><li><a onclick=\"CallProductInfo(" + reader["ID"]+ ")\">" + reader["ID"]
                    + "," + reader["Name"]
              + "</a></li></ul>";

然后你必须有一个javascript函数,它实际回发到服务器端代码或重定向到带有传递id的产品信息页面。也就是说,在你的页面中(不是后面的代码),为回发提供类似这样的脚本......

<script>
    function CallProductInfo(id)
    {
        __doPostBack('ProductInfoId', id);
    }
</script>

在你的代码背后,在你的页面加载事件处理程序中,你会有这样的东西:

if (Request["__EVENTTARGET"] == "ProductInfoId")
        {
            ProductInfo(Convert.ToInt64(Request["__EVENTARGUMENT"]));
        }

答案 1 :(得分:1)

不幸的是,您无法在Literal Control上创建服务器端事件。

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

在您的aspx中使用:

(defparameter *test-cases*      ; list of (ARG RET)
  '(((1 2 3) (2 3))
    ((1 (2 (3 4) 5) 6) (((4) 5) 6))
    ((1 (3 (5 6) 4) (7 8 9) 2) (((6) 4) (8 9) 2))))
(loop :for (arg ret) :in *test-cases* :do
  (assert (equal (drop-first arg) ret))
  (assert (equal (first-drop arg) ret)))

您的aspx.cs应包含:

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

这将设置每个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"]); } 以将它们自己的值传递给事件参数隐藏控件并执行回发到服务器。

然后,您可以检查事件目标是否是必需的,并使用已回发的值调用方法。

只需更改上面的示例lit1文本即可遍历您的数据。

答案 2 :(得分:0)

好的,大家好我发现了什么问题。我们先生的导师今天告诉我们,我们可以使用数据网格。高。 谢谢大家的回复!