【问题标题】:Is there a viewstate event before postback?回发之前是否有视图状态事件?
【发布时间】:2012-05-16 01:54:50
【问题描述】:

考虑以下情况:添加到客户端文本框中的文本值在回发时添加到视图状态(因此当页面重新加载时该值仍然存在于文本框中)。

当我通过 jquery 将值从 listbox1 移动到 listbox2 时,listbox2 中的项目不会添加到视图状态。 (注意:项目是在 POST 之前选择的,listbox2 中的值在服务器上通过 request.form.getvalues("listbox2").getvalue(index).tostring())回发时可用)

我不是在寻找解决办法,我已经找到了。我想知道“为什么”没有添加 listbox2 值。是否为文本框而不是列表框触发了一些事件?只是想更好地了解发生了什么。谢谢!

【问题讨论】:

    标签: asp.net postback viewstate listboxitems


    【解决方案1】:

    添加到客户端文本框中的文本值在回发时添加到视图状态(因此当页面重新加载时该值仍然存在于文本框中)。

    这个说法是错误的。 TextBox 服务器控件的值在回发期间被保留,因为浏览器在发布数据中发送它,并且在回发时TextBox 将值从发布数据复制到其Text 属性。不涉及视图状态,您可以通过设置EnableViewState="False" 进行验证。 (我在这里假设TextBox 是可见并启用的;否则,浏览器不会在发布数据中发送其值,并且需要查看状态保留价值。)

    当我通过 jquery 将值从 listbox1 移动到 listbox2 时,listbox2 中的项目不会添加到视图状态。

    对于多选ListBox 服务器控件,浏览器会在发布数据中发送每个选定项的值。在回发时,ListBox 查看发布数据中的每个值,在其Items 集合中搜索相应的项目,并将该项目的Selected 属性设置为True。它不会向Items 集合添加无法识别的值;相反,如果启用了事件验证,则会引发“无效的回发或回调参数”异常。同样,不涉及视图状态。

    【讨论】:

    • 为什么在客户端(通过 jquery)添加到 listbox2 的项目在服务器上的 Items 集合中不可用?
    • ListBox 控件并非由 ASP.NET 团队设计为自动将动态创建的项目添加到 Items 集合中。 (正如我在上一段中指出的那样,它会引发异常,因为它假定恶意用户正在尝试篡改发布数据。)您可以创建自己的 ListBox 控件来执行此操作,但您只有每个项目的,因为浏览器不发送选项文本。
    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多