ASP CustomValidator 失败,Modal 未从屏幕上清除
ASP CustomValidator fails and Modal doesn't clear from screen
我正在向表单添加新字段。该表单用于将状态从未批准更新为 approved.The 目标是确保如果未进行任何更改但单击了更新按钮,则会显示错误并且不会处理任何更新。在我添加新字段并从 RequiredFieldValidator
切换到 CustomValidator
.
之前,这确实有效
问题
现在,如果不对下拉菜单进行任何更改,模式将关闭,但 window 的其余部分将变灰,应用程序似乎挂起。
这有点超出我的理解范围,这是一次很好的学习经历。
编辑:
控制台出错
Doc-Comp-Composition-Templates:348 Uncaught TypeError: $(...).ddlCS is not a function
at ValidateStatusChange_ClientValidate (Doc-Comp-Composition-Templates:348)
at eval (eval at CustomValidatorEvaluateIsValid (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:450), <anonymous>:1:1)
at HTMLSpanElement.CustomValidatorEvaluateIsValid [as evaluationfunction] (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:450)
at ValidatorValidate (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:200)
at Page_ClientValidate (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:119)
at Sys$WebForms$PageRequestManager$_doPostBackWithOptions [as _doPostBackWithOptions] (ScriptResource.axd?d=JnUc-DEDOM5KzzVKtsL1tRZpRA_LXrniqfBmVmIZ3cAuPpCW1plWZw2RXdO0zo-BiAzza2U9Udple6pVeaDdyS14EzqQJMs1mhrjSf56Z17-S803UF2Z43EZ-6v-WWTiunEhUO4tmGiISgd0nYLoQNVyt3LQvd2TOLU7l5Fq6n-tE3oJIofGXa6OGTnxPRDQ0&t=fffffffffc18b87d:831)
at ScriptResource.axd?d=D9drwtSJ4hBA6O8UhT6CQi4RxEM3HXQdD1kANRSxcVDQlciZR3AdFzJCI2OSpEJ8btryaMvtylBgqedQo2VFV1HT2WfhU1dHTVqnIz5ypNeiBiXQQMaUQfmxLJUQguR-W97gIReVDFvaBQUHY7tXxFcflqZ4dU-xR3P7jVPaHdY1&t=fffffffffc18b87d:47
at HTMLInputElement.onclick (Doc-Comp-Composition-Templates:1)
要验证的控件:
<div class="form-group">
<label for="ddlCS">Current Status:</label>
<asp:DropDownList ID="ddlCS" runat="server" CssClass="form-control"
ToolTip="Choose Status" Enabled="false" ValidationGroup="gStatusChange" />
</div>
<div class="form-group">
<label for="ddlNS">New Status:</label>
<asp:DropDownList ID="ddlNS" runat="server" CssClass="form-control"
ToolTip="Choose Status" ValidationGroup="gStatusChange" />
</div>
<div class="form-group">
<label for="ddlPA">Proof Approval:</label>
<asp:DropDownList ID="ddlPA" runat="server" CssClass="form-control"
Tooltip="Choose Proof Status" ValidationGroup="gStatusChange" />
</div>
<div class="col-sm-3">
<asp:Button ID="btnUpdate" runat="server" Text="Update Status"
CssClass="btn btn-primary pull-left" ToolTip="Save Changes"
OnClick="btnUpdate_Click"/>
</div>
验证者:
<asp:CustomValidator ID="custvStatusChange" runat="server" Display="None"
ValidationGroup="gStatusChange"
ErrorMessage="Wow what an error!"
OnServerValidate="ValidateStatusChange_ServerValidate"
ClientValidationFunction="ValidateStatusChange_ClientValidate"/>
<asp:ValidationSummary ID="vscustvStatusChange" runat="server" ToolTip="Error Summary"
ShowSummary="true"
ShowMessageBox="false"
CssClass="alert alert-danger"
ValidationGroup="gStatusChange" />
<Triggers>
<asp:AsyncPostBackTrigger ControlID="gvTemplates"
EventName="RowCommand"/>
<asp:AsyncPostBackTrigger ControlID="btnUpdate" EventName="Click"/>
</Triggers>
服务器端验证:
protected void ValidateStatusChange_ServerValidate(object source,
ServerValidateEventArgs args)
{
if (ddlCS.SelectedValue == ddlNS.SelectedValue || ddlPA.SelectedIndex == 0)
{
args.IsValid = false;
}
}
客户端验证:
<script>
$m = jQuery.noConflict();
</script>
<script type="text/javascript">
function ValidateStatusChange_ClientValidate(source, args) {
var cStatus = $(source).ddlCS("select").prop("selectedIndex");
var nStatus = $(source).ddlNS("select").prop("selectedIndex");
var pStatus = $(source).ddlPA("select").prop("selectedIndex");
if (cStatus == nStatus || pStatus == 0) {
args.IsValid = false;
} else {
args.IsValid = true;
}
}
function closeModal() {
$('#modStatus').modal('hide');
$('body').removeClass('modal-open');
$('.modal-backdrop').remove();
}
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function () {
function closeModal() {
$('#modStatus').modal('hide');
$('body').removeClass('modal-open');
$('.modal-backdrop').remove();
}
});
</script>
按钮点击事件:
protected void btnUpdate_Click(object sender, EventArgs e)
{
Page.Validate("custvStatusChange");
if (Page.IsValid)
{
#region Template Status change
if (ddlNS.SelectedIndex > 0)
{
if (ddlCS.SelectedValue != ddlNS.SelectedValue)
{
if (ddlCS.SelectedValue == "5" && hfProofStatus.Value == "N")
{
lblUpdateStatus.Text = "Proof must be approved before template can be";
lblUpdateStatus.CssClass = "text-danger";
}
else
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Close", "$('#modStatus').modal('hide');$('body').removeClass('modal-open');$('.modal-backdrop').remove();", true);
// save and notify
DotNetAuth auth = (DotNetAuth)HttpContext.Current.Session["AppSysAuth"];
if (CompositionTemplate.UpdateStatus(Convert.ToInt32(hfTemplateID.Value),
Convert.ToInt32(ddlNS.SelectedValue), auth.Name, hfFileName.Value))
{
lblUpdateStatus.Text = "Status change saved";
lblUpdateStatus.CssClass = "text-success";
BindGrid();
}
else
{
lblUpdateStatus.Text = "Error saving status change";
lblUpdateStatus.CssClass = "text-danger";
}
}
}
}
#endregion
}
}
ddlCS()
函数(还有 ddlNS()
和 ddlPA()
)未定义,因为它们未在 $(source)
的 jQuery 选择器中定义。您应该更改这些行:
var cStatus = $(source).ddlCS("select").prop("selectedIndex");
var nStatus = $(source).ddlNS("select").prop("selectedIndex");
var pStatus = $(source).ddlPA("select").prop("selectedIndex");
到下面的这些行,每个下拉列表使用 ClientID
(因为您没有使用 ClientIDMode="Static"
属性,因此假定动态客户端 ID 已到位):
var cStatus = $('#<%= ddlCS.ClientID %>').prop("selectedIndex");
var nStatus = $('#<%= ddlNS.ClientID %>').prop("selectedIndex");
var pStatus = $('#<%= ddlPA.ClientID %>').prop("selectedIndex");
或者使用 select
元素选择器,每个下拉列表的 id
属性设置为 ClientID
,如下所示:
var cStatus = $('select [id=<%= ddlCS.ClientID %>]').prop("selectedIndex");
var nStatus = $('select [id=<%= ddlNS.ClientID %>]').prop("selectedIndex");
var pStatus = $('select [id=<%= ddlPA.ClientID %>]').prop("selectedIndex");
我正在向表单添加新字段。该表单用于将状态从未批准更新为 approved.The 目标是确保如果未进行任何更改但单击了更新按钮,则会显示错误并且不会处理任何更新。在我添加新字段并从 RequiredFieldValidator
切换到 CustomValidator
.
问题
现在,如果不对下拉菜单进行任何更改,模式将关闭,但 window 的其余部分将变灰,应用程序似乎挂起。
这有点超出我的理解范围,这是一次很好的学习经历。
编辑:
控制台出错
Doc-Comp-Composition-Templates:348 Uncaught TypeError: $(...).ddlCS is not a function
at ValidateStatusChange_ClientValidate (Doc-Comp-Composition-Templates:348)
at eval (eval at CustomValidatorEvaluateIsValid (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:450), <anonymous>:1:1)
at HTMLSpanElement.CustomValidatorEvaluateIsValid [as evaluationfunction] (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:450)
at ValidatorValidate (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:200)
at Page_ClientValidate (ScriptResource.axd?d=nv7asgRUU0tRmHNR2D6t1FZw7wze8nmx-kJRmw2XEjbK3oXSAIyhKQNPF6n1kyJ-XavItdyBmyr8jQKkgUwJ4hvE-EOowyd5E-dQMLMfuYhYi3DooAGZ6tCMyoNO-1bI0OD14u047d3MStBJK15cjQ2&t=fffffffff974e48e:119)
at Sys$WebForms$PageRequestManager$_doPostBackWithOptions [as _doPostBackWithOptions] (ScriptResource.axd?d=JnUc-DEDOM5KzzVKtsL1tRZpRA_LXrniqfBmVmIZ3cAuPpCW1plWZw2RXdO0zo-BiAzza2U9Udple6pVeaDdyS14EzqQJMs1mhrjSf56Z17-S803UF2Z43EZ-6v-WWTiunEhUO4tmGiISgd0nYLoQNVyt3LQvd2TOLU7l5Fq6n-tE3oJIofGXa6OGTnxPRDQ0&t=fffffffffc18b87d:831)
at ScriptResource.axd?d=D9drwtSJ4hBA6O8UhT6CQi4RxEM3HXQdD1kANRSxcVDQlciZR3AdFzJCI2OSpEJ8btryaMvtylBgqedQo2VFV1HT2WfhU1dHTVqnIz5ypNeiBiXQQMaUQfmxLJUQguR-W97gIReVDFvaBQUHY7tXxFcflqZ4dU-xR3P7jVPaHdY1&t=fffffffffc18b87d:47
at HTMLInputElement.onclick (Doc-Comp-Composition-Templates:1)
要验证的控件:
<div class="form-group">
<label for="ddlCS">Current Status:</label>
<asp:DropDownList ID="ddlCS" runat="server" CssClass="form-control"
ToolTip="Choose Status" Enabled="false" ValidationGroup="gStatusChange" />
</div>
<div class="form-group">
<label for="ddlNS">New Status:</label>
<asp:DropDownList ID="ddlNS" runat="server" CssClass="form-control"
ToolTip="Choose Status" ValidationGroup="gStatusChange" />
</div>
<div class="form-group">
<label for="ddlPA">Proof Approval:</label>
<asp:DropDownList ID="ddlPA" runat="server" CssClass="form-control"
Tooltip="Choose Proof Status" ValidationGroup="gStatusChange" />
</div>
<div class="col-sm-3">
<asp:Button ID="btnUpdate" runat="server" Text="Update Status"
CssClass="btn btn-primary pull-left" ToolTip="Save Changes"
OnClick="btnUpdate_Click"/>
</div>
验证者:
<asp:CustomValidator ID="custvStatusChange" runat="server" Display="None"
ValidationGroup="gStatusChange"
ErrorMessage="Wow what an error!"
OnServerValidate="ValidateStatusChange_ServerValidate"
ClientValidationFunction="ValidateStatusChange_ClientValidate"/>
<asp:ValidationSummary ID="vscustvStatusChange" runat="server" ToolTip="Error Summary"
ShowSummary="true"
ShowMessageBox="false"
CssClass="alert alert-danger"
ValidationGroup="gStatusChange" />
<Triggers>
<asp:AsyncPostBackTrigger ControlID="gvTemplates"
EventName="RowCommand"/>
<asp:AsyncPostBackTrigger ControlID="btnUpdate" EventName="Click"/>
</Triggers>
服务器端验证:
protected void ValidateStatusChange_ServerValidate(object source,
ServerValidateEventArgs args)
{
if (ddlCS.SelectedValue == ddlNS.SelectedValue || ddlPA.SelectedIndex == 0)
{
args.IsValid = false;
}
}
客户端验证:
<script>
$m = jQuery.noConflict();
</script>
<script type="text/javascript">
function ValidateStatusChange_ClientValidate(source, args) {
var cStatus = $(source).ddlCS("select").prop("selectedIndex");
var nStatus = $(source).ddlNS("select").prop("selectedIndex");
var pStatus = $(source).ddlPA("select").prop("selectedIndex");
if (cStatus == nStatus || pStatus == 0) {
args.IsValid = false;
} else {
args.IsValid = true;
}
}
function closeModal() {
$('#modStatus').modal('hide');
$('body').removeClass('modal-open');
$('.modal-backdrop').remove();
}
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function () {
function closeModal() {
$('#modStatus').modal('hide');
$('body').removeClass('modal-open');
$('.modal-backdrop').remove();
}
});
</script>
按钮点击事件:
protected void btnUpdate_Click(object sender, EventArgs e)
{
Page.Validate("custvStatusChange");
if (Page.IsValid)
{
#region Template Status change
if (ddlNS.SelectedIndex > 0)
{
if (ddlCS.SelectedValue != ddlNS.SelectedValue)
{
if (ddlCS.SelectedValue == "5" && hfProofStatus.Value == "N")
{
lblUpdateStatus.Text = "Proof must be approved before template can be";
lblUpdateStatus.CssClass = "text-danger";
}
else
{
ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Close", "$('#modStatus').modal('hide');$('body').removeClass('modal-open');$('.modal-backdrop').remove();", true);
// save and notify
DotNetAuth auth = (DotNetAuth)HttpContext.Current.Session["AppSysAuth"];
if (CompositionTemplate.UpdateStatus(Convert.ToInt32(hfTemplateID.Value),
Convert.ToInt32(ddlNS.SelectedValue), auth.Name, hfFileName.Value))
{
lblUpdateStatus.Text = "Status change saved";
lblUpdateStatus.CssClass = "text-success";
BindGrid();
}
else
{
lblUpdateStatus.Text = "Error saving status change";
lblUpdateStatus.CssClass = "text-danger";
}
}
}
}
#endregion
}
}
ddlCS()
函数(还有 ddlNS()
和 ddlPA()
)未定义,因为它们未在 $(source)
的 jQuery 选择器中定义。您应该更改这些行:
var cStatus = $(source).ddlCS("select").prop("selectedIndex");
var nStatus = $(source).ddlNS("select").prop("selectedIndex");
var pStatus = $(source).ddlPA("select").prop("selectedIndex");
到下面的这些行,每个下拉列表使用 ClientID
(因为您没有使用 ClientIDMode="Static"
属性,因此假定动态客户端 ID 已到位):
var cStatus = $('#<%= ddlCS.ClientID %>').prop("selectedIndex");
var nStatus = $('#<%= ddlNS.ClientID %>').prop("selectedIndex");
var pStatus = $('#<%= ddlPA.ClientID %>').prop("selectedIndex");
或者使用 select
元素选择器,每个下拉列表的 id
属性设置为 ClientID
,如下所示:
var cStatus = $('select [id=<%= ddlCS.ClientID %>]').prop("selectedIndex");
var nStatus = $('select [id=<%= ddlNS.ClientID %>]').prop("selectedIndex");
var pStatus = $('select [id=<%= ddlPA.ClientID %>]').prop("selectedIndex");