为什么WebForms会继续呈现此数据属性?

时间:2015-03-11 16:21:08

标签: javascript c# jquery asp.net webforms

尽管我的代码在PostBack上将其删除,但WebForms仍然使用TextBox属性重新呈现data-控件 - 这是我首先不应该做的,因为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属性。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

这个问题的答案是:Page Life Cycle。

我错误地尝试在TextBox中检查OnInit时尚未提供的值。 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;
    }
}

这个故事的寓意:Page Life Cycle会吃你的午餐。