为什么这段代码执行了却被忽略了?
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" />
if ($(this).is(':checked'))
应该可以
在我的 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" />
if ($(this).is(':checked'))
应该可以