2009-12-15 55 views
1

你将如何在代码后面(服务器端)动态创建一个新的html li元素?你将如何操纵服务器端的html列表?

如何在服务器端的现有ul元素中访问li? 我需要FindControl获取所有li项目,然后添加新的li项目。

更新

我使用jQuery AJAX来访问服务器端,所以我必须使用静态的WebMethod。 FindControl是非静态方法。

<script type="text/javascript"> 
     $(function(){ 
     $("#sortable").sortable(); 
     $("#sortable").disableSelection(); 
    }); 

这是jQuery的AJAX调用

$(document).ready(function() { 
     // Add the page method call as an onclick handler for the div. 
     $("#Result").click(function() { 
      $.ajax({ 
       type: "POST", 
       url: "DraggableTest.aspx/SomeMethod", 
       data: "{}", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       success: function(msg) { 
        // Replace the div's content with the page method's return. 
        $("#Result").text(msg.d); 
       } 
      }); 
     }); 
    }); 

这是代码隐藏

[WebMethod] 
    public static string SomeMethod() 
    { 
     // using System.Web.UI.HtmlControls; 
     HtmlGenericControl ul = FindControl("sortable") as HtmlGenericControl; 
     if (ul != null) 
     { 
      foreach (HtmlControl c in ul.Controls) 
      { 
       if (c.TagName.ToLower() == "li") 
       { 
        // Processing here 
       } 
      } 
     } 


    } 
+0

如果你告诉我们你的整个形势开始,而不是位添加额外的点点滴滴位你可能会得到更好的答案 - 它_sounds_喜欢你这个接近的错误的方式,但是你没有真正解释问题是什么,所以很难知道。 – Dexter 2009-12-15 16:13:19

+0

感谢您的额外更新 - 但是如果您可以告诉我们您想通过ajax查询来实现什么,可能会有所帮助?你试图实现什么功能? – Dexter 2009-12-15 16:23:44

+0

我有一些可排序的ul。我想要保存每个拖动元素的位置。 – nemke 2009-12-15 16:33:05

回答

4

您可以通过添加一个HTML列表项HtmlGenericControl

System.Web.UI.HtmlControls.HtmlGenericControl li = new System.Web.UI.HtmlControls.HtmlGenericControl("li"); 
li.InnerHtml = "<b>Some text</b>"; 
Page.Controls.Add(li); 

在上面的例子中,我只是直接添加控件到页面的结束 - 你显然需要考虑你将它添加到什么父元素。

更新 为了回答这个问题,你编辑后问的问题的多余部分,如果你的上行链路控制有ulListId一个id,并被标记为runat="server,您可以通过编程使用FindControl方法找到它。然后,只需通过UL的孩子循环:

 // using System.Web.UI.HtmlControls; 
     HtmlGenericControl ul = Page.FindControl("ulListId") as HtmlGenericControl; 
     if (ul != null) { 
      foreach (HtmlControl c in ul.Controls) 
      { 
       if (c.TagName.ToLower() == "li") 
       { 
        // Processing here 
       } 
      } 
     } 
+0

谢谢,但如果我使用WebMethod调用。方法必须是静态的,并且FindControl不是静态的 - 不能在静态上下文中访问snon静态方法。 – nemke 2009-12-15 15:55:52

+0

你喜欢增加额外的位!您将无法通过WebMethod调用直接将内容添加到您的网页 - 您需要在客户端上执行此操作。 我会建议您: - 从你的WebMethod返回一个IList 或KeyValuePair <字符串,字符串>,并处理数据列表项的呈现在客户端(使用jQuery),或 上 - 如果你”真的很想处理服务器上的格式,使用jQuery在屏幕上找到相关的UL控件,并将其作为参数传递给webMethod – Dexter 2009-12-15 16:11:55

+0

对不起,添加了额外的位:),但我认为栈是理想的实时解决问题。我补充说明。更好地知道我是否使用了错误的方法。谢谢你的帮助。 – nemke 2009-12-15 16:24:38

0

您可以使用HtmlGenericControl创建服务器端li元素。另一种选择可能是使用LiteralControl。

编辑:如果你的<ul>是一个服务器控件(具有runat =“server”属性),你可以通过Page.FindControl(“yourControlID”)来访问它。

// <ul runat="server" id="yourControlID"></ul> 

HtmlGenericControl myUl = (HtmlGenericControl)Page.FindControl("yourControlID"); 
LiteralControl liByLiteral = new LiteralControl("<li>li by LiteralControl</li>"); 
myUl.Controls.Add(liByLiteral); 
HtmlGenericControl newByHtmlGenericControl = new HtmlGenericControl("li"); 
newByHtmlGenericControl.InnerText = "li by HtmlGenericControl"; 
myUl.Controls.Add(newByHtmlGenericControl); 
// You can access other <li> elements in <ul> control 
+0

他说的,除了我们通常利用中继器来处理听起来像你在做的事情。 : - ) – 2009-12-15 15:24:45