gpt4 book ai didi

c# - 有没有办法让 ValidationSummary 与客户端验证器一起工作?

转载 作者:太空狗 更新时间:2023-10-29 17:41:09 26 4
gpt4 key购买 nike

.NET ValidationSummary 控件聚合来自在回发时触发的验证器的错误消息。有什么方法可以让它也显示来自客户端验证器的错误消息吗?

我正在处理的问题是,在一个长页面上,可以单击提交按钮,使一些客户端验证程序失败,但永远不会看到错误消息。我希望在按钮附近有一个验证摘要,以便用户永远不会没有反馈。

我希望任何具有客户端验证的标准 .NET 验证器都反射(reflect)在验证摘要中,但我最关心的是让 RequiredFieldValidators 正常工作。

我可以破解它,以便在点击按钮时,在短暂的延迟后自动显示一条一般消息,告诉用户检查页面上的错误。这适用于没有发生回发的情况,但会很丑陋。

下面是一些不适合我的示例代码:

<asp:LinkButton ID="btnOpen" runat="server" ToolTip="Open" ValidationGroup="Create" CausesValidation="true" />
<asp:TextBox ID="txtBlah" runat="server" />
<asp:RequiredFieldValidator ID="reqBlah" runat="server" ControlToValidate="txtBlah" EnableClientScript="true" Display="Dynamic" ErrorMessage="Enter some blah" ValidationGroup="Create" />
<asp:ValidationSummary ID="summary" runat="server" EnableClientScript="true" DisplayMode="BulletList" HeaderText="Errors:" ShowMessageBox="true" ShowSummary="true" ValidationGroup="Create" />

验证器在没有回发的情况下显示错误,但摘要没有。

正如评论中所建议的那样,页面上可能还有其他内容使我的示例代码无法运行。我现在无法尝试重现确切的原因,尽管该页面非常大并且上面有一些 UpdatePanel,所以我会坚持我的 hack,直到有更多时间处理它。

感谢您的帮助。我建议人们不要再研究这个问题,因为我认为我提供的信息不足以真正帮助任何人解决问题。

最佳答案

我也遇到过这个问题。在花了太多时间剖析 MS 客户端验证 API 之后 ;),我将问题追溯到 DOM 解析的一个奇怪问题,下面我解释了为什么在某些情况下会发生这种情况以及我用来修复它的解决方案。

[为什么会这样?]

每个验证器控件都呈现为具有用于执行客户端验证的非标准属性的跨度。例如下面的 evaluationfunction 属性:

<span id="...id" controltovalidate="...BillingName" errormessage="blah" evaluationfunction="RequiredFieldValidatorEvaluateIsValid" display="Dynamic" initialvalue="" >*</span>

这些属性由 API 中的框架解析,如下所示(注意 eval):

for (i = 0; i < Page_Validators.length; i++) {
val = Page_Validators[i];
if (typeof(val.evaluationfunction) == "string") {
eval("val.evaluationfunction = " + val.evaluationfunction + ";");
}
}

问题在于我们总是返回未定义的特殊属性,即评估函数,因此字符串从未转换为正确的验证器对象。这对我来说仍然是个谜,因为据我所知,它似乎完全是随机的。

当 Page_ClientValidate 启动时,会发生什么情况,它会尝试调用每个验证器验证函数,但它不能,因为 evaluationfunction == undefined。它没有使用 false 作为默认值,而是假定为 true,因此实际上没有发生任何验证,并且从客户端看来一切都有效。 if (typeof(val.evaluationfunction) == "function") 永远不会为真,因此它会返回到先前分配的 val.isvalid = true;。 p>

function ValidatorValidate(val, validationGroup, event) {
val.isvalid = true;
if ((typeof(val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup))
{
if (typeof(val.evaluationfunction) == "function")
{
val.isvalid = val.evaluationfunction(val);
if (!val.isvalid && Page_InvalidControlToBeFocused == null && typeof(val.focusOnError) == "string" && val.focusOnError == "t")
{
ValidatorSetFocus(val, event);
}
}
}
ValidatorUpdateDisplay(val);
}

[我是如何解决的?]

为了解决这个问题,我编写了一个可以在 DOM 完成加载后调用的例程。此例程循环所有验证器控件并尝试使用 JQuery 从 SPAN 中的原始标记数据创建对象属性,尽管您可能使用任何其他等效工具来获得相同的结果。此例程不会修复所有验证器控件,主要是必需的字段验证器和正则表达式验证器。如果您使用其他具有附加属性的验证控件,则需要更改它。

function fixValidatorProperties()
{
if (Page_Validators && Page_Validators[0] && Page_Validators[0].evaluationfunction == undefined)
{
var val = null;
for (i = 0; i < Page_Validators.length; i++)
{
val = Page_Validators[i];

if (val.initialvalue == undefined)
val.initialvalue = "";

if ($(val).attr("evaluationfunction"))
eval("val.evaluationfunction = " + $(val).attr("evaluationfunction") + ";");
if ($(val).attr("controltovalidate"))
val.controltovalidate = $(val).attr("controltovalidate");
if ($(val).attr("errormessage"))
val.errormessage = $(val).attr("errormessage");
if ($(val).attr("Dynamic"))
val.Dynamic = $(val).attr("Dynamic");
if ($(val).attr("initialvalue"))
val.initialvalue = $(val).attr("initialvalue");
if ($(val).attr("ValidationExpression"))
val.validationexpression = $(val).attr("ValidationExpression");
}
}
}

关于c# - 有没有办法让 ValidationSummary 与客户端验证器一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1857098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com