为什么这段代码执行了却被忽略了?

Why is this code executed but ignored?

在我的 Sharepoint 页面中,在提交表单时,元素会恢复到它们的原始状态(如果一个复选框在开始时未被选中,被用户选中,它会恢复到未选中状态,等等)。

很公平。

但我想 "save state" 和 return 那些东西回到原来的样子。特别是一件事是下拉列表的可见性。如果在选择 "Save" 按钮时可见,则在提交表单后应该 return 可见;两个 DropDownLists,其中最多一个在任何给定时间可见,开始不可见,或者更具体地说,"slid up" 像这样:

$(window).load(function () {
    $('[id$=ddlPayToIndividual]').hide();
    $('[id$=ddlPayToVendor]').hide();
});

为了保存 DropDownLists 的可见状态,我添加了布尔值:

bool paymentToAnIndividualDropDownChosen = false;
bool paymentToAVendorDropDownChosen = false;

...然后在选择“保存”按钮时分配它们:

private void btnSave_Click(object sender, EventArgs e)
{
    try
    {
        // Note current state of elements, so can be restored after saving/submitting
        paymentToAnIndividualDropDownChosen = rbPaymentToIndividual.Checked;
        paymentToAVendorDropDownChosen = rbPaymentToVendor.Checked;
        . . .
}

然后我尝试在同一个处理程序(“保存”按钮的单击事件)的末尾将它们设置回去,如下所示:

if (paymentToAnIndividualDropDownChosen)
{
    //rbPaymentToIndividual.Checked = true; <= This didn't work - jQuery does not respond to programatic clicks!
    ddlPaymentToIndividual.Visible = true;
}

到达代码,可见值设置为 true(前提是我在选择“保存”按钮之前通过选中 "rbPaymentToIndividual" 使下拉菜单可见,但它没有任何效果 - 下拉菜单仍然隐藏。

正如您可以从注释掉的代码中推断出的那样,我还尝试以编程方式检查单选按钮,当手动完成时,它会触发以下客户端代码:

$(document).on("click", '[id$=rbPaymentToIndividual]', function () {
    if (this.checked) {
        $('[id$=ddlPayToVendor]').slideUp();
        $('[id$=ddlPayToIndividual]').slideDown();
    }
});

...但显然 jQuery 不响应程序引发的事件。

还是时间问题?是不是因为表单仍在 "submit" phase/state 中,所以这不起作用 - 无论是客户端代码还是服务器端代码,还是两者都有?

如果这是问题所在 - 直到保存按钮处理程序退出后提交才会完成,因此我过早地将 DropDown 设置为可见 - 我可以在哪里放置代码来完成此表单设置回到提交前的状态? Page_Load() 事件是执行此操作的地方吗?如果是,是否有一些 属性 我可以询问以确定表单是否刚刚提交?

更新

我将代码移到了 Page_Load() 事件的末尾,如下所示:

if (Page.IsPostBack) 
{
    if (paymentToAnIndividualDropDownChosen)
    {
        ddlPaymentToIndividual.Visible = true;
    }
} 

...但是,因为整个 shebang 重新开始,paymentToAnIndividualDropDownChosen 的初始值为 false 可见,所以我的意图虽然很好,但还是要与 brimstone 保持联系。

那么我如何 恢复到提交前状态 - 是 .INI 文件、注册表使用或 Cookie,这是完成此操作的常用方法吗?

更新 2

这似乎很奇怪的是我 能够恢复到 HTMLTable 的提交前状态;此代码位于“保存”按钮单击处理程序中:

// Re-visiblize any rows with vals
if (RowContainsVals(3))
{
    foapalrow3.Style["display"] = "table-row";
}
if (RowContainsVals(4))
{
    foapalrow4.Style["display"] = "table-row";
}
if (RowContainsVals(5))
{
    foapalrow5.Style["display"] = "table-row";
}
if (RowContainsVals(6))
{
    foapalrow6.Style["display"] = "table-row";
}

...它工作正常(显示任何具有任何值的行,尽管在开始时只显示一行)。更奇怪的是,也许是函数:

private bool RowContainsVals(int rownum)
{
    bool rowdirty = false;
    switch (rownum)
    {
        case 3:
            rowdirty = ((!String.IsNullOrEmpty(boxFund2.Text)) ||
                (!String.IsNullOrEmpty(boxIndex2.Text)) ||
                (!String.IsNullOrEmpty(boxOrganization2.Text)) ||
                (!String.IsNullOrEmpty(boxAccount2.Text)) ||
                (!String.IsNullOrEmpty(boxActivity2.Text)) ||
                (!String.IsNullOrEmpty(boxAmount2.Text)));
            break;
        case 4:
            rowdirty = ((!String.IsNullOrEmpty(boxFund3.Text)) ||
            . . .

...在输入文本框中查找值;如果 DropDownList 的可见状态在提交过程中丢失,为什么 TextBoxes/text 输入中的值没有丢失?

Redmond(或某个地方)有些东西已经烂掉了。

更新 3

作为对 的回应,这里有一些与所讨论的两个下拉菜单相关的更多代码:

代码隐藏/C#:

rbPaymentToIndividual = new RadioButton
{
    CssClass = "finaff-webform-field-input",
    ID = "rbPaymentToIndividual"
};
rbPaymentToIndividual.Text = PAYMENT_OR_REIMBURSEMENT_TO_AN_INDIVIDUAL;
rbPaymentToIndividual.GroupName = "paymentTo";
rbPaymentToIndividual.Checked = false;
cellRadioButton1_1.Controls.Add(rbPaymentToIndividual);


rbPaymentToVendor = new RadioButton
{
    CssClass = "finaff-webform-field-input",
    ID = "rbPaymentToVendor"
};
rbPaymentToVendor.Text = PAYMENT_TO_A_VENDOR;
rbPaymentToVendor.GroupName = "paymentTo";
cellRadioButton2_1.Controls.Add(rbPaymentToVendor);

渲染的 HTM 来自 "View Source":

<input id="ctl00_ctl24_g_5f3fedca_19f7_4bc3_b84e_efbef0c48a33_ctl00_rbPaymentToIndividual" type="radio" name="ctl00$ctl24$g_5f3fedca_19f7_4bc3_b84e_efbef0c48a33$ctl00$paymentTo" value="rbPaymentToIndividual" />

<input id="ctl00_ctl24_g_5f3fedca_19f7_4bc3_b84e_efbef0c48a33_ctl00_rbPaymentToVendor" type="radio" name="ctl00$ctl24$g_5f3fedca_19f7_4bc3_b84e_efbef0c48a33$ctl00$paymentTo" value="rbPaymentToVendor" />

jQuery Selector

:checked Selector

if ($(this).is(':checked'))

应该可以