【问题标题】:asp.net 2.0 custom control view state issueasp.net 2.0 自定义控件视图状态问题
【发布时间】:2009-12-23 15:04:42
【问题描述】:

我有一个自定义控件,其中包含 RadioButtonList 控件。在选择其中一个单选按钮时,控件会进行回发以执行一些服务器端工作,并且页面会重新加载并选择正确的单选按钮。这在我的测试页面中运行良好。

我现在将控件移动到网站上的页面上,它将在选中radiobutton时,出现回前,但是当页面重新加载时,不再选择了RadioButton。所以看起来选择不再被保存到视图状态中。

任何关于我应该查看新页面的哪些方面的建议都将非常感激。

干杯

附录 - 更多信息

感谢斯蒂芬的建议

该控件最初是作为 Web 用户控件开发的,使用设计器、非常简单的实现、用于 onload 和单选按钮选择更改时的服务器端处理程序。单独的 dll 用于后面的代码和一个 ascx。然后,我将其转换为自定义控件,以将 ascx 拉入 dll 中,并在后面加上已编译的代码。

我没有在测试页面中动态创建控件,在 aspx 的顶部有一个标签和一个 来执行此操作。单选按钮列表是使用设计器在 ascx 中拖放的,所以我没有实现创建它的代码。所以都很香草。 我真的在寻找我应该在使用该控件的页面中查看的差异,以弄清楚为什么它在测试页面中有效,但在它需要驻留的站点页面中无效。

*********** 加法 *********** 我有很短的时间来解决这个问题,不得不把它交给另一个开发人员。当我从他那里找到解决方案时,我会在这里发布。 非常感谢大家的意见。

*********** 回答 ************* 这是接管的开发人员的答案。

您的测验控件非常好,回发时未保留值的原因是因为在您将其启用时继承了基类中的功能。本质上,它在页面加载方法中执行了 DataBind,该方法在页面生命周期中是在调用回发方法之前,因此它重置了下拉列表的值。最后,我设置了一些保存下拉列表值的视图状态属性。所以这不是你可能知道的。

【问题讨论】:

  • 不,这是一个普通的 asp.net 页面。
  • @SLaks,如果页面使用Ajax,我应该寻找什么?我知道我说过没有,但我很好奇,因为我迟早必须再次处理 ajax。

标签: .net asp.net postback


【解决方案1】:

确保你的页面有

EnableViewState=True

【讨论】:

    【解决方案2】:

    首先,这不是 ViewState 问题。 Viewstate 用于对页面上的控件进行编程更改。如果您将标签的文本设置为不同于 CODE BEHIND 中 ASPX 上的文本,则该值将存储在视图状态中。 .NET 有一种机制(并且它通过您的控件需要实现的接口进行控制)将 POST 数据解析回它所属的控件,这发生在 ViewState 加载之后但在 Page_Load 事件触发之前。

    现在,这背后的原因有几种不同的可能性:

    首先,您的自定义控件中的这个单选按钮是在 CreateControls 方法中生成的,还是您的控件正在呈现的直接 HTML?如果它是直接的 HTML,那么您需要确保您正在处理从回发返回的预期值。如果它是一个服务器控件,在您的自定义控件中被声明为 NEW 并且没有在 CreateControls 方法中被实例化和处理,那么您需要在那里移动它。

    其次是 ASPX 页面上的这个控件,还是在后面的代码中添加到页面中。如果它是在后面的代码中添加到页面中的,那么它很可能是在 .NET 解析器完成分发回发数据之后添加的。检查您的表单集合以查看该值是否存在。

    【讨论】:

    • 我斯蒂芬,我已经添加并补充了原始问题,其中填写了您提出的一些问题以及更多问题。干杯
    • +1 表示 ViewState 不用于在回发之间保持控件的状态。 ControlState 用于此。
    • Stephen/Rich,这真的是控制状态吗?这个标准的发布数据不是在 POST 请求中发回的吗?单选按钮控件是否使用 asp.net 2.0 中的控制状态而不是 asp.net 1.1 来存储状态?
    • Preets - 值存储在 FORMS POST 集合中。 2.0 的 CONTROLSTATE 是一个不同的野兽,基本上是一个不能被禁用的 ViewState。它用于存储 1.1 控件将存储在 ViewState 中的 ESSENTIAL 信息(例如寻呼机的 PageIndex)。
    【解决方案3】:

    上次我需要 ViewState 作为单选按钮时,我必须重写 LoadViewState 和 SaveViewState 方法以使其正常工作。

    【讨论】:

      【解决方案4】:

      得到了接管该项目的开发者的回复 ->

      “您的测验控件很好,回发时未保留值的原因是因为您将其启用时基类中的继承功能。本质上,它在页面加载方法中执行了 DataBind页面生命周期在调用回发方法之前,因此它重置了下拉列表的值。最后我设置了一些保存下拉列表值的视图状态属性。所以这不是你可能知道的。"

      希望这对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-21
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多