为什么即使启用了runat = server,我也无法在HtmlTables上看到任何数据?

时间:2011-05-13 17:23:13

标签: asp.net html-table

我有两个HTML表,第一个通过数据库中的条目填充在服务器端,第二个通过客户端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)
                {
...

2 个答案:

答案 0 :(得分:0)

说明

问题是,当向该服务器发送请求时,会创建该页面的新实例,以及.aspx文件中定义的所有控件。这个页面和子控件的新实例开始时没有数据。

当您向服务器提交“发布”请求时(“回发”),该页面会查看请求的表单集合(来自浏览器提交的&lt; input&gt;标记的数据)并尝试更新网页页面上的控件,其中包含在该表单集合中找到的数据。

此外,除了这一点之外,viewstate感知控件可能会尝试根据前一个请求中同一控件的不同实例留下的viewstate中找到的数据来填充自己。

具体来说,如果查看TextBox webcontrol,可以看到它实现了IPostBackDataHandler接口。发生的情况是,在请求开始时,页面会查看请求提交的表单集合中的所有值。当页面在表单集合中找到其键与TextBox控件的ID匹配时的值时,页面可以使用IPostBackDataHandler接口的LoadPostData方法将该更新的值应用于该TextBox控件。

听起来你正在做的是将几行数据添加到表中,然后将它们全部发送回服务器。您可以执行此操作,但问题是您的网页上没有可以充当该数据目标的控件。具体来说,您需要指定&lt; input&gt;的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);

答案 1 :(得分:0)

我认为客户端更改的问题是您的表格没有向表单的帖子数据添加任何内容。您正在操作客户端上的标记,但标记本身不是回发的内容,只是输入元素及其值已发布。尝试添加隐藏的输入并在那里记录客户端更改,以便将数据发布回服务器。然后在服务器端,您可以解析输入字段的内容以确定所做的更改。

我怀疑您的表中存在类似的问题,该问题通过服务器端代码填充。如果您没有将更改记录存储到某个地方的声明标记(viewstate,session等),那么服务器不知道前一个请求生成了什么,并且返回到声明的标记。

查看一些有关动态声明控件的文章,以获得更深入的解释。尽管使用的技术和示例有点过时,http://www.4guysfromrolla.com/articles/081402-1.aspx#postadlink可以很好地了解正在发生的事情。