Page.IsValid 是如何工作的?

2024-01-18

我有以下代码RequiredFieldValidator. The EnableClientScript属性在验证控件中设置为“false”。我还在浏览器中禁用了脚本。

我没有使用Page.IsValid在后面的代码中。不过,当我在文本框中没有任何值的情况下提交时,我会得到error message.

从@Dai的评论中,我知道这可能是一个问题,如果有任何代码Page_Load这是在一个执行postback。不会抛出验证错误。

(但是,对于按钮单击处理程序,无需检查Page.IsValid)

if (Page.IsPostBack)
{
    string value = txtEmpName.Text;
    txtEmpName.Text = value + "Appended";
}

QUESTION

  1. 为什么之前没有进行服务器端验证Page_Load?
  2. 为什么我使用的时候效果很好Page.IsValid?
  3. 您能提供解释这一点的文章参考吗? (不是说 - 总是使用Page.IsValid;但有些东西说明了必须使用的场景是什么Page.IsValid

UPDATE 1

Refer ASP.NET 验证器的常见误解 http://blogs.microsoft.co.il/blogs/linqed/archive/2009/09/01/asp-net-validators-common-misconception.aspx

Page.IsValid仅在运行后才能访问Page.Validate()之后隐式调用的方法Page_Load。如果您将所有逻辑保留在 Page_Load 事件处理程序中(强烈建议不要这样做!),请调用Page.Validate()在检查之前Page.IsValid.

Note: 建议不保留所有逻辑都在Page_Load。如果按钮单击事件发生某些情况,请将其移至按钮单击事件处理程序。如果下拉事件发生某些情况,请将其移至下拉所选项目更改事件处理程序。

UPDATE 2

看来我们需要添加If(Page.IsValid) in button click另外,如果我们使用的是Custom Validator与服务器端验证。参考CustomValidator 无法正常工作 https://stackoverflow.com/questions/11064613/customvalidator-not-working-well.

Note:此处存在客户端验证问题:是否使用 Page_IsValid 或 Page_ClientValidate()(对于客户端事件) https://stackoverflow.com/questions/13832818/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>

背后的代码

protected void Button1_Click(object sender, EventArgs e)
{
    string value = txtEmpName.Text;
    SubmitEmployee(value);
}

参考:

  1. 我应该始终调用 Page.IsValid 吗? https://stackoverflow.com/questions/1039465/should-i-always-call-page-isvalid
  2. ASP.NET 验证控件 – 要点、提示和技巧 http://www.dotnetcurry.com/ShowArticle.aspx?ID=121
  3. CustomValidator 无法正常工作 https://stackoverflow.com/questions/11064613/customvalidator-not-working-well

验证发生在Page_Load,但在事件处理程序之前(请参阅http://msdn.microsoft.com/en-us/library/ms178472(v=VS.100).aspx 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% 取决于您的架构,以及您是否能够假设初始验证期间通过/失败的验证在同一页面生命周期的后续验证期间仍然通过/失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Page.IsValid 是如何工作的? 的相关文章

  • global.asax 范围和生命周期澄清

    我需要在我当前正在进行的项目中实现多个应用程序级行为 有几件事我需要弄清楚 1 在哪里以及如何定义应用程序级变量 2 这些变量的生命周期是多长 或者更准确地说 在什么情况下它们会被丢弃 应用程序池回收 应用程序二进制文件从内存中删除并在下一
  • 如何将现有 ASP.NET 网站转换为 HTML 5

    我有一个网站 首先由 Visual Studio 2005 创建 然后转换为 Visual Studio 2008 目前使用 Visual Studio 2008 在 Visual Studio 2010 Service Pack 1 之后
  • 从asp.net ListBox中获取所有选定的项目

    任何人都知道一个顺利的方法来获得所有selected使用扩展方法在列表框控件中的项目 并且 请不要让我争论与如何获取这样一个列表无关 因为最终一切都使用循环来迭代项目并找到选定的项目 var selected yourListBox Ite
  • ASP.NET Webform 中的异常处理

    在 ASP NET Webforms 中处理异常的首选方法是什么 你有Page Error您添加的方法 我认为 web config级别 并且当发生错误时整个站点将被重定向到该级别 这是否意味着您不应在 Web 表单应用程序中的任何位置使用
  • 仅在页面加载时执行 Javascript,而不是回发 (SharePoint)

    我正在尝试在 SharePoint 网站上的自定义页面上加载页面时执行一些 JavaScript 它使用当前用户填充人员选择器 问题是代码也在回发时执行 这是我不希望的 因为它会重置人员选择器的任何更改 我尝试过使用if IsPostBac
  • 在 Asp.Net MVC 视图中使用 dropdownlistfor 和 foreach 吗?

    我有一个带有 foreach 循环的视图 用于模型的列表属性 现在 我希望能够让用户使用下拉列表设置列表中每个项目的值 但我不知道该怎么做 当它不在 foreach 循环中时 我使用过类似的东西 Html DropDownListFor m
  • 混合 ASP.NET WebForms 和 MVC 授权

    我正在尝试将一些 MVC3 功能混合到现有的 WebForms 应用程序中 我遵循了一些指南 除了授权部分之外 一切都已设置完毕并正常工作 现有的应用程序有
  • 如何让浏览器后退按钮通过 AJAX 调用带您返回?

    我有一个页面 上面有很多动态生成的复选框 当用户单击这些复选框时 页面上的许多内容会通过 ajax 动态更改 最终用户抱怨 在点击提交然后点击后退按钮更改某些内容后 他们的选择被破坏了 他们必须重新做一遍 我见过一些网站 gmail fac
  • 什么可能会在一台服务器上导致此错误,而在另一台服务器上则不会?

    我们有一个连接到外部 Web 服务的 ASP Net 网站 几天前它突然停止工作 基本代码是这样的 Try request New ExternalWebService ProcessRequestService Error occurs
  • 在 ASP.NET 中动态设置主题

    我有一个连接到不同域的应用程序 我没有复制和修改每个应用程序 而是在硬盘驱动器上使用相同的物理位置 但在 IIS 上使用单独的应用程序池和网站 基本上我想根据主机名更改主题 IE 用户访问 websome com 获取 websome 主题
  • 如何使用 Windows 身份验证指定 Windows 用户从 ASP 连接到 MS SQL Server 数据库

    我已经尝试了一个多月的时间来将这里的 ASP 脚本连接到 SQL Server 数据库 但每次我使用这个连接字符串时 Data Source dbServer01 Initial Catalog POS123 Integrated Secu
  • 带有 jQ​​uery 日期选择器 OnTextChanged 的​​文本框未触发

    我有一个带有 OnTextChanged 事件的 asp textbox 当从绑定到它的 jQuery 日期选择器中选择新日期时 我想触发该事件 但在选择日期时 OnTextChanged 永远不会触发 如果我 手动 更改文本 它会触发 但
  • 基于 Web.Config 使用的 GAC 程序集版本

    Good Day 我有一个在 GAC 中使用自定义程序集的项目 为了能够使用它 我在中添加了对我的项目的引用 C WINDOWS Microsoft NET assembly GAC MSIL JOHN CommonLib v4 0 1 0
  • ChannelFactory重用策略

    我一直在读到 ChannelFactory 的创建是昂贵的 除非有技术原因不这样做 否则应该在可能的情况下重用 ChannelFactory 或者通过某种方式缓存它们 或者使用工厂的静态实例 根据您的经验 您发现哪些 ChannelFact
  • 如何使用泛型类型的 DataContractSerializer 编写自定义序列化器?

    我想编写一个自定义序列化器 用于将会话状态存储到Azure 缓存 预览版 这意味着这个自定义序列化器必须实现IDataCacheObjectSerializer 如果我错了 请告诉我 我需要编写这个自定义序列化程序的原因是我需要序列化一些包
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 在 ASP.Net 网站中使用 VBScript 中的变量

    我花了一天的大部分时间来研究这个问题 但找不到答案 我对 stackoverflow 比较陌生 询问多个问题是否有一定的礼仪 过去几天我问了三个问题 Anyways 这是代码隐藏文件中的代码 它执行脚本 systeminfo vbs 并且工
  • 您会认为这是单例/单例模式吗?

    想象一下 在 Global asax cs 文件中 我有一个实例类作为私有字段 我们这样说 private MyClass myClass new MyClass 我在 Global 上有一个名为 GetMyClass 的静态方法 它获取当
  • ASP.NET MVC ActionFilterAttribute 在模型绑定之前注入值

    我想创建一个自定义操作过滤器属性 该属性在模型绑定期间可访问的 HttpContext 项中添加一个值 我尝试将其添加到 OnActionExecuting 中 但似乎模型绑定是在过滤器之前执行的 你知道我该怎么做吗 也许模型绑定器中有一个
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默

随机推荐

  • Knex.js:创建表并插入数据

    鉴于我有一个像这样的 Knex js 脚本 exports up function knex Promise return knex schema createTable persons function table table incre
  • 如何转换spring-boot请求参数

    目前 请求方法接收编码令牌作为参数 该令牌是String但不是 JSON 或类似的东西 然后该令牌被解码为数据类 GetMapping value api xyz public ResponseEntity
  • 如何获取 YouTube 直播的实际视频 URL?

    有没有一种方法可以获取像这样的 YouTube 直播的 HLS URLhttps www youtube com embed WVZpCdHq3Qg https www youtube com embed WVZpCdHq3Qg 我尝试过典
  • NumPy 库导入错误:DLL 加载失败:找不到指定的过程

    我正在 Windows 10 上使用 Visual Studio 2017 学习 python 当我尝试将 NumPy 库导入到我的代码中时 出现此错误 我尝试过卸载并重新安装 寻找libiomp5md dll每条指令ImportError
  • Google Cloud Run 上的 numpy 和 pandas 导入速度缓慢

    我正在开发一个 API 并将其部署在 Google Cloud Run 上 有一个导入 pandas 和 numpy 的预启动 python 脚本 当我对导入进行计时时 在 Cloud Run 上 numpy 大约需要 2 秒 pandas
  • 复选框中的 ng-change 被触发多次,因为 ng-click 超过了它

    由于代码比 1000 个单词更好 我创建了一个 plunker 来展示我的问题 http bit ly 1uiR2wy http bit ly 1uiR2wy 给定特定的 DOM 元素 事情是我有一个带有 ng change 的输入复选框
  • 对于这种情况,最好的数据库结构是什么?

    我有一个保存房地产 MLS 多重列表服务 数据的数据库 目前 我有一个表包含所有列表属性 价格 地址 平方英尺等 有几种不同的财产类型 住宅 商业 出租 收入 土地等 每种财产类型共享大部分属性 但也有一些属性是该财产类型所独有的 我的问题
  • 从后台重新启动应用程序后 iAds 加载受到限制(也发生在 iAdSuite 中)

    我正在努力实施NavigationBanner iAdSuite示例到我的项目中 以便我可以共享一个AdBannerView跨多个视图控制器的实例 但我不断收到以下错误 错误域 ADErrorDomain代码 2 操作无法完成 加载受到限制
  • 构建 Eclipse 项目时自动运行 JUnit

    我想在保存 Eclipse 项目时自动运行单元测试 每当我保存文件时 该项目就会自动构建 所以我认为这应该以某种方式实现 我该怎么做 是获取 ant 脚本并更改项目构建以使用带有目标的 ant 脚本的唯一选择build and compil
  • 我可以从 ASP.NET 页面下载由内存流生成的 Excel 文件吗?

    我有一个 ASP NET 页面 用户在其中提供 ID 然后我们从数据库中提取一些数据并将其放入 Excel 电子表格中 我想在内存中创建 Excel 文件 然后允许用户下载该文件 我可以在服务器上创建一个文件 然后删除它 但这似乎没有必要
  • 为什么我会收到 NoClassDefFoundError: java/awt/Desktop?

    我正在尝试打开一个URI使用 Swing 我得到了上述错误 原因是什么以及如何解决 当我在控制台中执行此操作时 一切正常 但当我在 GUI 中执行此操作时 出现此错误 我应该说我使用Weblogic作为服务器 Code private st
  • 基于列将两个 pandas DataFrame 相乘

    如果我有两个 DataFrame 如何将它们按列相乘以生成包含结果的 DataFrame 例如 df1 pd DataFrame np random randint 10 size 5 4 columns A B C D A B C D 0
  • 将 initWithNibName 与故事板结合使用

    下面是将 initWithNibName 与单独的 xib 视图一起使用的示例 TerminalViewController ctrl TerminalViewController alloc initWithNibName Control
  • 将现有项目转换为 Silverlight 4 时出现问题

    我们有一个正在运行的 Silverlight 3 项目 将目标框架更改为 Silverlight 4 后 应用程序将不再启动 它在生成的 InitializeComponent 方法中的以下行中引发异常 System Windows App
  • ExtJS 4 动态更改网格存储

    是否可以在 ExtJS 4 中更改网格存储 例如 我有两个模型 User Ext define User extend Ext data Model hasMany Product Product Ext define Product ex
  • 从 Rails3 项目中卸载 gem 的最佳方法是什么?

    我通过 Gemfile 使用捆绑器安装了所有 gem 我 错误地 认为 如果我从 Gemfile 中删除了一个 gem 并运行 捆绑安装 则删除的 gem 将被卸载 我查看了捆绑程序帮助文件 据我所知 它没有卸载 gem 的方法 我是否只使
  • GNU 屏幕没有响应,似乎被阻止

    GNU 屏幕似乎冻结了 无法输入用户输入 我正在使用 GNU 屏幕 当我按下屏幕时 它变得没有响应 我可以执行所有 GNU 屏幕命令 但无法输入用户输入 我不想关闭这个屏幕 因为我有重要的工作 我不想失去它 In the commands
  • 设置查询以搜索 dojo 数据网格的所有字段

    我有一个包含多个字段的 Dojo DataGrid 我目前正在将查询设置为一次搜索一个字段 如下所示 grid setQuery name Bob ignoreCase true 但是我希望查询能够立即搜索所有字段 例如 假设我有三个标题为
  • 关于 .shuffle、.batch 和 .repeat 的 Tensorflow 数据集问题

    我有一个关于使用 tf Dataset 进行批处理 重复和随机播放的问题 我不清楚如何使用重复和随机播放 我明白那个 batch将决定有多少训练样本将经历随机梯度下降 使用 repeat and shuffle我仍然不清楚 第一个问题 即使
  • Page.IsValid 是如何工作的?

    我有以下代码RequiredFieldValidator The EnableClientScript属性在验证控件中设置为 false 我还在浏览器中禁用了脚本 我没有使用Page IsValid在后面的代码中 不过 当我在文本框中没有任