ASP.NET Web Control在第一次回发后显示旧数据

时间:2011-08-16 18:53:56

标签: c# asp.net vb.net forms web-controls

我在ASP.NET表单应用程序中使用自定义Web控件时遇到了一个奇怪的问题。

对于Web应用程序,我认为创建一个继承自CompositeControl的类可以节省大量时间,该类将标签与其他控件(例如TextBox或{{}组合在一起1}}。此复合控件具有几个属性,用于包装基础属性的属性(例如:EnteredText包装DropDownList)。控件可以与常规控件一样用于数据绑定,但不是TextBox.Text而是使用txtBox.Text = someObject.someProperty。 然后在ASPX页面和ASCX用户控件上使用这些控件。

第一个版本的Web控件是用C#编写的,效果很好。这些控件放在网站的compositeControl.EnteredText = someObject.someProperty中。但是,这个文件夹变得相当大,因为策略我必须用VB.NET编写所有内容,所以我决定创建一个类库来将VB.NET版本的控件放在那里,这样我就没有了将整个Web应用程序转换为VB.NET,但只转换为控件。

但是,VB.NET版本工作。当我单击App_Code folder中的链接时,它会打开一个弹出窗口并正确填充所有文本框。关闭屏幕并单击同一网格中的其他链接时,框不会正确填充,并且框中会显示第一个回发的数据。使用调试器时,我看到所有框都填充了正确的数据,在渲染阶段,底层GridView的Text属性显示了所有新数据。它只是没有在屏幕上显示。回发后检索数据,例如按下保存按钮时,正常工作。

当我将TextBox中的控件放在同一页面上时,它会按预期工作并显示新数据,而不是上一次回发中的数据。

以下是两个粘贴bin URL,第一个用于工作C#版本,第二个用于VB.NET版本。

C#版本:http://pastebin.com/SuWaHrMt

VB.NET版本:http://pastebin.com/9aeV7St1

以下是在ASCX文件中使用它的示例:

App_Code folder

cc前缀在web.config中指定:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CustomControl.ascx.cs" Inherits="Controls_CustomControl" %>
<%@ Register Namespace="UI.CompositeControls" TagPrefix="cs" %>

<cs:TextBoxWithLabel ID="TextBoxWithLabel1" runat="server" LabelText="Voornaam" />
<cc:LabeledTextBox ID="tbwlVoornaam" runat="server" LabelText="Voornaam" />

我在这里缺少什么使C#版本工作而VB版本不起作用?

提前致谢!如果您想要澄清,请随时提出问题。

更新: 我在有问题的ASCX上禁用了ViewState,它可以工作:

<pages theme="Default" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
  <controls>
    <add assembly="CompositeControls" namespace="CompositeControls" tagPrefix="cc" />
  </controls>
  <namespaces>
    <add namespace="CompositeControls" />
  </namespaces>
</pages>

我的同事找到了以下代码段:

  

如果每次往返都重新插入控件,每一代   动态创建的控件将从视图中获取属性值   前一组控件的状态。在许多情况下,您可以避免这种情况   通过将容器控件的EnableViewState属性设置为的问题   假。在这种情况下,不会保存有关动态控件的信息,并且   与控件的连续版本没有冲突。

我只是不确定这是如何突然适用于控件的。基于this MSDN article on ViewState我猜测它发生了,因为控件是在回发事件之后发生的CreateChildControls方法中添加的。

有人能解释一下究竟发生了什么吗?

1 个答案:

答案 0 :(得分:1)

您在哪些浏览器中遇到此问题? 我最近在Firefox中遇到了类似的问题,只是通过禁用Firebug缓存解决了这个问题。 (http://i.stack.imgur.com/bRRjb.jpg)