我在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方法中添加的。
有人能解释一下究竟发生了什么吗?
答案 0 :(得分:1)
您在哪些浏览器中遇到此问题? 我最近在Firefox中遇到了类似的问题,只是通过禁用Firebug缓存解决了这个问题。 (http://i.stack.imgur.com/bRRjb.jpg)