簡體   English   中英

即使啟用了runat = server,為什么也看不到HtmlTables上的任何數據?

[英]Why can't I see any data on HtmlTables even with runat=server enabled?

我有兩個HTML表,第一個通過數據庫中的條目填充在服務器端,第二個通過客戶端Javascript填充,該Javascript允許用戶動態添加行並通過輸入文本框輸入數據。

表單末尾的按鈕負責將數據從這兩者提交到SQL Server后端。 問題是回發,我無法從這些表中讀取。 客戶端托管表和服務器端托管表都是這種情況。

<table style="display: none; width: 100%" runat="server" id="tblWebOrderArbitraryContacts" class="borderBottomStyle">
                                            <table runat="server" id="recipientTable" style="display: block; width: 100%" class="borderBottomStyle"></table>



//the problem is the row count is always zero, regardless of what data is in it

if(tblWebOrderArbitraryContacts.Rows != null && tblWebOrderArbitraryContacts.Rows.Count > 0)
            {
                //go through automatically derived (from integrations) contacts
                foreach (HtmlTableRow row in tblWebOrderArbitraryContacts.Rows)
                {
...

說明

問題在於,當將請求發送到該頁面的服務器時,將創建該頁面的新實例,以及.aspx文件中定義的所有控件。 頁面和子控件的這個新實例開始時沒有數據。

當您向服務器提交“發布”請求(“發布”)時,頁面將查看請求的表單集合(瀏覽器提交的<input>標記中的數據),並嘗試更新頁面上的Web控件以及在該表單集合中找到的數據。

同樣,但要緊的是,了解視圖狀態的控件可能會嘗試根據視圖狀態中發現的數據來填充自身,這些數據是同一控件與先前請求的不同實例所留下的。

具體來說,如果您查看TextBox Web控件,則可以看到它實現了IPostBackDataHandler接口。 發生的情況是,在請求開始期間,頁面將查看請求提交的表單集合中的所有值。 當頁面在表單集合中找到其鍵與TextBox控件的ID匹配的值時,頁面可以使用IPostBackDataHandler接口的LoadPostData方法將該更新后的值應用於該TextBox控件。

聽起來您正在執行的操作是將幾行數據添加到表中,並將它們一次全部發布回服務器。 可以執行此操作,但是問題是頁面上沒有控件可以用作該數據的目標。 具體來說,您需要分配<input>標記的name屬性,以便將數據提交到服務器,但是name屬性的值又是什么呢? 它不會與您頁面上的控件匹配。 此外,如果您一次提交多個行,您如何區分一個行?

可能的解決方案

假設您的頁面經過javascript操作和用戶輸入后看起來像這樣:

<table>
  <thead><tr></th>First Name</th><th>Last Name</th></tr></thead>
  <tbody>
    <tr><td><input name="FirstName[0]" value="John" /></td><td><input name="LastName[0]" value="Smith" /></td></tr>
    <tr><td><input name="FirstName[1]" value="Jane" /></td><td><input name="LastName[1]" value="Doe" /></td></tr>
    <tr><td><input name="FirstName[2]" value="Spider" /></td><td><input name="LastName[2]" value="Man" /></td></tr>
  </tbody>
</table>

在回發期間的代碼隱藏中,您可以使用以下代碼訪問該數據:

string firstName = Request.Form["FirstName[0]"];
string lastName = Request.Form["LastName[0]"];

您還可以執行以下操作:

int index = 0;
bool dataFound;
do
{
  dataFound = false;

  string firstName = Request.Form["FirstName["+index+"]"];
  if (firstName != null)
    dataFound = true;

  string lastName = Request.Form["LastName["+index+"]"];
  if (lastName != null)
    dataFound = true;

  // do something with firstName and lastName ...

  index++;
} while (dataFound);

我相信與您的客戶端更改有關的問題是您的表沒有添加任何到窗體的發布數據。 您正在操縱客戶端上的標記,但是標記本身不是回發的內容,只是輸入元素及其值被張貼了。 嘗試添加隱藏的輸入並記錄客戶端的更改,以便將數據發布回服務器。 然后,在服務器端,您可以解析輸入字段的內容,以確定進行了哪些更改。

我懷疑通過服務器端代碼填充的表存在類似的問題。 如果您沒有在某個地方(視圖狀態,會話等)存儲對聲明的標記所做的更改的記錄,則服務器不知道前一個請求生成了什么,並退回到聲明的標記上。

查看一些有關動態聲明控件的文章,以進行更深入的說明。 http://www.4guysfromrolla.com/articles/081402-1.aspx#postadlink很好地了解了正在發生的事情,盡管所使用的技術和示例有些陳舊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM