asp.net – Page.IsValid如何工作?
|
我有一个RequiredFieldValidator的以下代码。 EnableClientScript属性在验证控件中设置为“false”。我也在浏览器中禁用脚本。 我不在后面的代码中使用Page.IsValid。不过,当我在文本框中提交没有任何值时,我会收到错误消息。 从@Dai的意见,我知道这可以是一个问题,如果在Page_Load中有任何代码在回发中执行。将不会抛出验证错误。 (但是,对于按钮单击处理程序,没有必要检查Page.IsValid) if (Page.IsPostBack)
{
string value = txtEmpName.Text;
txtEmpName.Text = value + "Appended";
}
题 >为什么服务器端验证不会在Page_Load之前发生? 更新1 参见ASP.NET Validators Common Misconception
注意:建议不要保留Page_Load中的所有逻辑。如果事件发生在按钮单击事件上,将其移动到按钮单击事件处理程序。如果某事发生在下拉事件上,请将其移动到下拉选择的项目更改事件处理程序。 更新2 看起来,我们需要添加If(Page.IsValid)在按钮点击也如果我们使用自定义验证器与服务器端验证。参见CustomValidator not working well。 注意:客户端验证问题在这里:Whether to use Page_IsValid or Page_ClientValidate() (for Client Side Events) MARKUP <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
alert('haiii');
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ValidationSummary runat="server" ID="vsumAll" DisplayMode="BulletList" CssClass="validationsummary" ValidationGroup="ButtonClick" />
<asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="valEmpName" runat="server" ControlToValidate="txtEmpName"
EnableClientScript="false" ErrorMessage="RequiredFieldValidator" Text="*" Display="Dynamic"
ValidationGroup="ButtonClick"></asp:RequiredFieldValidator>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" ValidationGroup="ButtonClick" />
</div>
</form>
</body>
</html>
CODE BEHIND protected void Button1_Click(object sender,EventArgs e)
{
string value = txtEmpName.Text;
SubmitEmployee(value);
}
参考文献: > Should I always call Page.IsValid? 解决方法验证发生在Page_Load之后,但在事件处理程序之前(见 http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx)。如果您的按钮不会导致验证,您必须手动启动Page.Validate。 您可能不会询问Page.IsValid,直到(1)您调用Page.Validate或(2)一个控件,导致验证是/包含在回发的源。 如果您需要在事件处理程序启动之前进行验证,您可以使用: if (Page.IsPostback)
{
Page.Validate( /*Control Validation Group Name Optional*/ );
if (Page.IsValid)
{
//Do some cool stuff
}
}
您可能还需要考虑重新设计,因此您不需要这样做。 在处理导致验证的控件的事件处理程序中,Page.IsValid保证可用。在所有其他情况下,重新请求验证通常更安全。一种用于处理具有验证器的表单上的提交的模型: void btnSubmit_Click(object sender,EventArgs e)
{
this.UpdateGUIWithSubmitRequest();
if (Page.IsValid)
{
this.ProcessSuccessfulSubmission();
}
else
{
this.ProcessInvalidSubmission();
}
}
如果您使用的CustomValidator具有非常昂贵的验证步骤,您可以考虑将结果缓存在HttpResponse.Cache中,以便在发生对Page.Validate的多个调用时不必重新验证。 void CustomValidator_ServerValidate(object source,ServerValidateEventArgs args)
{
CustomValidator self = (CustomValidator)source;
string validatorResultKey = self.ClientID;
bool? validatorResult = Context.Items[validatorResultKey] as bool?;
if (validatorResult.HasValue)
{
args.IsValid = validatorResult.Value;
return;
}
bool isValid = this.DoSomethingVeryTimeConsumingOrExpensive();
Context.Items[validatorResultKey] = isValid;
args.IsValid = isValid;
}
这当然取决于您的架构100%,以及您是否能够假设在初始验证期间通过/失败的验证在相同页面生命周期的后续验证期间仍然通过/失败。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET的登录控件问题
- nuget – 在部署的asp.net mvc解决方案中需要packages.conf
- asp.net-mvc – $.ajax({async:false})请求仍然异步发射?
- asp.net-mvc – 新ASP.NET MVC 6身份中AspNetUsers表中的Co
- asp.net-mvc – 认证之前调用的ASP.NET MVC控制器构造函数
- Asp Classic返回具体的http状态码
- 如何使用ASP.NET Repeater删除尾随逗号?
- asp.net-mvc – 从FormCollection元素获取多个复选框
- ASP.NET Web.config AppSettings性能
- asp.net-mvc – 在嵌套内容的区域上使用_ViewStart
- asp-classic – 检索ADO Recordset字段名称(经典
- ASP.NET 5 HTML5历史
- asp.net-mvc – 在AppHarbor上获取文件内容
- asp.net – 查询字符串参数使我的应用程序面临风
- 用于诊断.NET中的内存泄漏的工具(ASP.NET应用程序
- asp.net-mvc-4 – 使用KNOCKOUT.JS和ASP.NET MVC
- asp.net – 是否有相当于mod_pagespeed Apache模
- 如何将Ninject集成到ASP.NET Core 2.0 Web应用程
- 如何在ASP.NET MVC 5.2.3应用程序的其他地方获取
- 如何在使用ASP.NET MVC的jQuery AJAX调用中触发“
