【问题标题】:Textbox not updating on page load ASP.net页面加载 ASP.net 时文本框未更新
【发布时间】:2012-05-10 23:12:55
【问题描述】:

我在网页的页面加载上有一个动态构建的表格,其中包含用户可以更改默认值的文本框。对用户输入值也有一些验证(例如,输入不能小于零)。当用户提交表格时,只存储有效的输入,并刷新页面,在重建时提取存储的值以填充表格。由于某些原因,即使它们不是持久的,在提交和重新加载页面后,文本框仍会显示无效输入,并且标签不会发生此问题。

文本框控件中是否有专门内置的内容导致此问题?是否有存储状态的地方,也许(我尝试将ViewState 标志设置为false)?这只是页面生命周期的一部分吗?

文本框内置在从 Page_Load 事件调用的方法中

void Page_Load(object sender, EventArgs e)
{
//page initialization...
ValidateData(); //This is where the current data is verified, and stored if valid
BuildTable(); //This takes that stored value for the text
}

void BuildTable
{ 
tbTable = new Table();  
tbRow = new TableRow();
tbCell = new TableCell();
TextBox tb = new TextBox();
tb.text = some stored value;
tbCell.Controls.Add(tb);
tbRow.Cells.Add(tbCell);
tbTable.Rows.Add(tbRow);
divFromPage.Controls.add(tbTable);
}

如果需要更多信息来帮助解决此问题,请告诉我。

【问题讨论】:

  • 那么,您的控件在提交时仍然具有它们所具有的值吗?您需要在 Page_Load 事件中将它们设为空白
  • 我该怎么做?它们已经是动态的,所以默认情况下它们在页面加载中不应该是空白的吗?
  • jas,我设法重现了您的确切问题(huray :))。我会调查这种奇怪的行为并回复你。出于好奇:您是否考虑过使用 asp:repeater?该组件通常用于此类情况。通常情况下:选择痛苦最小的路径:)
  • 编辑了我的答案,让我知道这对你是否有意义:)(顺便说一句,大约 30 分钟后)
  • Response.Redirect 对我不起作用,因为用户输入仅在页面的特定实例的生命周期内持续,并且在我重定向时丢失。随机 id 有效,但在我看来,如果这是文本框的常见行为,这应该是一个已解决的问题,不是吗?

标签: asp.net viewstate page-lifecycle


【解决方案1】:

编辑: 重现您的问题后,我得出以下结论。
我相信问题不在于视图状态,而是 asp 只是重新填充这些值,因为您提交的表单数据与您返回的输入元素具有相同的名称。
即使您动态生成它们,因为您将它们添加到同一个 div 中,结果总是相同的。这导致我有 2 个解决方案 :) :
我的解决方案 nr 3 仍然有效,我试了一下,按钮点击重定向按预期工作,没有发布的数据爬回我的文本框。
该语句处理了这一点:

Response.Redirect("~/test.aspx");

或者,您可以生成一个随机 ID,以确保您返回的输入字段名称与提交的名称不同。您不必更改所有名称,但如果表 ID 不同,则整个表将不再填充提交的数据。

请注意,您可能需要在页面加载中使用 if(IsPostBack),因为您的数据将在页面加载后立即丢失(除非您在此之前处理保存)


如果您正在执行回发,asp.net 使用它的视图状态来维护所有文本框、文本字段和所有其他表单元素(包括隐藏的输入类型)。
我目前看到您的问题的 3 个解决方案:
您可以执行 ivowiblo 建议的操作,在从数据库加载数据之前(我假设您这样做),您可以擦除所有文本字段。在第一次访问时,这将是毫无意义的,因为它们是空白的。但是在回发之后,它实际上会擦除文本字段。

您可以禁用这些文本框上的视图状态,以便 asp 不会保留该状态。我不确定为什么您的测试不起作用,但它应该起作用。如果您选择这种方法,请随时使用一些实际代码编辑您的问题

我个人最喜欢的:重定向页面。不只是返回结果并导致回发到页面,请执行以下操作:用户点击保存按钮后,您可以保存数据,然后执行 Response.Redirect 到当前页面。浏览器将被重定向到页面并且不涉及视图状态。

【讨论】:

  • 擦除文本字段是什么意思?因为它们是在那时构建的,所以默认情况下它们不应该是空白的吗?无论如何,因为我正在更改文本属性,这应该重要吗?我使用 Control.EnableViewState = false 禁用了父 div、表格、行、列、单元格和文本框上的视图状态 对于您的第三个选项,数据会为页面的每个实例保留,并默认返回新的原始值.这会影响您的解决方案吗?
  • 我猜你在代码隐藏的某个地方做了 Control.EnableViewState。为了避免在错误的动量(page_init,page_load,page_render,...)下触发它,您应该将其作为 EnableViewState="False" 放在您的 aspx 上。擦除文本字段,意思是 txtfirst.Text = ""。当它们由 asp 创建时它们是空白的(检查 Page_init 事件,它们在那里将是空白的)。当视图状态被加载时,它们在 page_load 上被填充。我对您的最后一句话没有正确理解:当您加载页面时,它应该从数据库中加载它的数据,不是吗?
  • 顺便说一句:为了避免进一步的混淆。你能把你的代码贴在你实际创建动态文本框的地方吗?
  • 这有帮助吗?你还需要更多吗?
  • 你能把你的整个 Page_load 也贴出来吗?您是仅在非回发还是每次都构建它?
【解决方案2】:

刚刚想通了这一点,这是一个 D'oh 时刻,我刚刚在 PreRender 事件中填充了数据,它工作得很好,感谢所有输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2023-03-14
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多