【问题标题】:Why does WebForms keep rendering this data- attribute?为什么 WebForms 一直呈现这个 data- 属性?
【发布时间】:2015-03-11 16:21:08
【问题描述】:

WebForms 不断重新渲染带有data- 属性的TextBox 控件,尽管我的代码在 PostBack 上删除了它——我一开始不应该这样做,因为 PostBack 进程会清除属性。我尝试清除OnInitOnUnload 中的属性,但它们在离开代码隐藏后以某种方式重新出现。它们只永远通过TextChanged 事件重置。

我想弄清楚我的 web.config 中是否有缓存设置会阻止 ASP.NET 正确删除此属性,这让我发疯了。

作为参考,我的代码的相关部分(据我所知):

.aspx JavaScript:

$("[data-confirm]").each(function () {
    var alertText = $(this).attr("<%= _data_confirm %>");

    $(alertText).dialog({
        modal: true,
        draggable: false,
        resizable: false,
        closeOnEscape: false,
        title: "Note",
        width: 330,
        buttons: {
            "Continue with Application": function () {
                $(this).dialog("close");
            }
        }
    });
});

.aspx.cs C#:

protected override void OnInit(EventArgs e)
{
    if (Page.IsPostBack)
    {
        ClearIraDistributionConfirmation();
    }

    iraDistribution.TextChanged += iraDistribution_TextChanged;
}

void iraDistribution_TextChanged(object sender, EventArgs e)
{
    if (SessionFormData.ConfirmedIraDistribution == false
        && SessionFormData.IraDistribution.HasValue
        && SessionFormData.IraDistribution.Value > 0)
    {
        iraDistribution.Attributes[_data_confirm] =
            "<div>You must submit a copy of the first page of your 2014 federal tax return to verify the rollover amount.</div>";
        iraDistribution.Attributes[_aria_live] = "assertive";
        SessionFormData.ConfirmedIraDistribution = true;
    }
    else if (SessionFormData.ConfirmedIraDistribution)
    {
        ClearIraDistributionConfirmation();
    }
}


private void ClearIraDistributionConfirmation()
{
    if (SessionFormData.ConfirmedIraDistribution)
    {
        iraDistribution.Attributes.Clear();
    }
}

我已验证在 PostBack 周期结束时,iraDistribution 没有设置任何属性。一旦我的 .aspx JS 到达 JavaScript 的第一行——这比我粘贴在这里的 JS 早——iraDistribution 就设置了它的data-confirm 属性。

我错过了什么?

【问题讨论】:

  • 通过查看 HTML 或在 JavaScript 中添加是否呈现服务器端应该不难确定(可能需要调试代码以查看其设置位置)...查看源 HTML 和使用设置的信息更新问题。
  • 这没有意义。您在这段代码中看到的是完整的循环。对话框 div 是在 C# 中创建的。这里不涉及服务器端 ID。
  • @AlexeiLevenkov,见编辑——我稍微澄清了这个问题。
  • data-confirm 的设置位置并不完全清楚,因为这不是整个页面,是否仅在文本更改事件中设置?
  • 是的——那是唯一的地方。编辑:Gads——我忘了​​输入提交了评论。我已经尝试在回发生命周期的其他时间点设置事件,但无法让它消失。我现在正在重构我在会话中存储确认的方式,看看是否受到影响。

标签: javascript c# jquery asp.net webforms


【解决方案1】:

这个问题的答案是:页面生命周期。

TextBox 中的值尚不可用时,我错误地尝试检查它们。 OnUnload 也不起作用,因为此时值已经被渲染到输出。

我已通过重新排序上面的代码并将其移至OnLoadComplete 事件来修复此错误。我的代码现在看起来像(嗯 - 不太像这样,但它被缩写为删除与 Session 交互的代码、我为提高可读性而定义的函数等):

protected override void OnLoadComplete(EventArgs e)
{
    base.OnLoadComplete(e);

    if (SessionFormData.ConfirmedIraDistribution)
    {
        iraDistribution.Attributes.Clear();
    }
    else if (SessionFormData.ConfirmedIraDistribution == false
        && SessionFormData.IraDistribution.HasValue
        && SessionFormData.IraDistribution.Value > 0)
    {
        iraDistribution.Attributes[_data_confirm] =
            "<div>You must submit a copy of the first page of your 2014 federal tax return to verify the rollover amount.</div>";
        iraDistribution.Attributes[_aria_live] = "assertive";
        SessionFormData.ConfirmedIraDistribution = true;
    }
}

这个故事的寓意:页面生命周期会吃掉你的午餐。

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多