繁体   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