2009-12-15 59 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