如何在WebForms中的form.onSubmit期间调用HTML5 form.checkValidity?

2024-04-20

我如何覆盖或扩展标准 WebFormsWebForm_OnSubmitJavaScript 函数?


我在 ASP.net WebForms 网站中使用 HTML5 输入类型。用户代理(例如 Chrome、IE、Firefox)已经正确处理数据清理、备用 UI 等。

通常,当用户单击<input type="submit">按钮,用户代理将停止提交,并显示 UI 来指示用户他们的输入将无效:

WebForms 的问题是它不使用Submit按钮。相反,一切都可以通过 JavaScript 回发来完成,而不是提交表格:

 <asp:LinkButton ID="bbOK" Text="Save User" runat="server" OnClick="bbOK_Click"></asp:LinkButton>

当呈现为客户端 HTML 时,将成为对 JavaScript 的调用:

WebForm_DoPostBackWithOptions(...)

非常长的形式是锚标签:

<a id="Really_Long_Thing_ctl00_bbOK" 
   href='javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$VistaToolbar$ctl00$bbOK", "", true, "", "", false, true))'>
   Save User
</a>

这意味着用户代理永远不会提示用户输入的元素无效。

尽管form不存在“已提交”,它仍然会触发onsubmit事件。我可以使用以下方法手动触发 HTML5 表单验证:

isValid = form.checkValidity();

理想情况下,我会在 ASP.NET WebForms 站点中挂钩该事件:

站点管理员

<form runat="server" onsubmit="return CheckFormValidation(this)">

<script type="text/javascript">
   function CheckFormValidation(sender) 
   {
      //Is the html5 form validation method supported?
      if (sender.checkValidity)
         return sender.checkValidity();

      //If the form doesn't support validation, then we just assume true
      return true;
   }
</script>

除了 WebForms 基础设施删除my onsubmit方法处理程序,并将其替换为自己的:

<form id="ctl01" onsubmit="javascript:return WebForm_OnSubmit();" action="UserProperties.aspx?userGuid=00112233-5544-4666-7777-8899aabbccdd" method="post">

所以我自己的提交调用被忽略。看来深入研究WebForm_OnSubmit导致了 ASP.NET WebForms 验证基础设施的兔子洞:

function WebForm_OnSubmit() 
{
   if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) 
      return false;
   return true;
}

它调用该函数:

var Page_ValidationActive = false;
function ValidatorOnSubmit() 
{
    if (Page_ValidationActive) {
        return ValidatorCommonOnSubmit();
    }
    else 
    {
        return true;
    }
}

哪个调用、哪个调用、哪个使用、哪个检查。

只想使用 WebForms 进行 HTML5 表单验证

问题是 WebForms 有一个huge用于在提交之前检查表单并通过标准化机制向用户显示错误的基础设施(以及我不使用的整个基础设施)。它接管了onsubmit形式的事件,并且它(不一定)使用<input type="submit">正在进行中。

我该如何说服 ASP.NET WebForms 网站让用户代理验证表单?

See also

  • HTML 验证和 ASP.NET Webforms https://stackoverflow.com/questions/9320844/html5-validation-and-asp-net-webforms
  • 如何运行 ASP.NET 页面的客户端验证? https://stackoverflow.com/questions/944525/how-do-i-get-client-side-validation-of-asp-net-page-to-run
  • 不使用提交按钮触发标准 HTML 验证(表单)? https://stackoverflow.com/questions/7002230/trigger-standard-html5-validation-form-without-using-submit-button
  • MSDN 杂志:使用 HTML5 表单打造更好的 Web 表单 http://msdn.microsoft.com/en-us/magazine/hh547102.aspx

Web 表单基础结构删除了处理程序,因为您尝试将其直接添加到可视设计环境中的元素上,而 Web 表单并非设计为以这种方式工作。

捕获提交处理程序很容易,您只需要稍微创造性地思考即可。

每当您尝试在 Web 表单环境中处理类似的事情时,您必须学会考虑随之而来的解决方案afterWeb 表单页面渲染管道。如果您尝试找到直接在 Web 表单引擎内部工作的解决方案,那么 Web 表单每次都会获胜。

如果您也需要,您可以在这里重现我的确切测试用例,或者您可以挑选出您需要的部分并根据需要重新使用。

Step 1

在 C# 中创建一个新的 Web 表单项目(如果需要,您可以在 VB 中执行此操作,但我将示例作为 C# 进行),创建项目后,右键单击应用程序引用,进入 NuGet 并安装jQuery。

无需 JQuery 即可完成此操作,只需使用本机方法,但今天是周日,我今天很懒:-)

Step 2

向您的项目添加一个新的网络表单(使用添加新项目)并将其命名为“默认.aspx',在此表单上添加一些文本、文本框、按钮和标签。

您的代码应类似于:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="jsvalidation.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    Please enter your name :
    <asp:TextBox ID="txtName" runat="server" data-jsname="username"></asp:TextBox>
    <asp:Button ID="btnSubmit" runat="server" OnClick="btnSubmit_Click" Text="Submit"     />
  </div>
  <asp:Label runat="server" ID="lblResult">...</asp:Label>
  </form>

</body>
</html>

然后按 F7(或双击按钮)转到表单的代码隐藏编辑器。

Step 3

将按钮处理程序的代码添加到后面的代码中。如果你做事的方式和我一模一样您的代码应类似于以下内容:

using System;

namespace jsvalidation
{
  public partial class Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {}

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
      if(Page.IsPostBack)
      {
        lblResult.Text = "Well hello there " + txtName.Text;
      }
    }
  }
}

此时,您可以通过按 F5 来测试工作,无论您在文本框中输入(或不输入)什么内容,当您按下提交按钮时,都应该与下面的标签中的消息一起出现。

现在我们已经设置了基本的网络表单,我们只需要拦截表单提交即可。

Step 4

正如我刚才所说,您需要跳出网络表单的框框进行思考。

这意味着您需要在页面呈现并发送到浏览器之后运行拦截。

Web 表单注入到混合中的所有 JS 通常在允许页面输出继续之前执行,这意味着在开始 body 标记之前执行。

为了让你的代码在它之后运行,你需要将你的脚本放在ENDhtml 输出,以便它最后运行。

在结束正文标记之前添加以下代码,但在结束表单标记之后

<script src="/Scripts/jquery-2.1.1.js"></script>
<script type="text/javascript">

  $(document).ready(function() {

    $('form').submit(function() {

      var uninput = $('input[data-jsname="username"]');
      var username = uninput.val();

      if (username == "")
      {
        alert("Please supply a username!");
        return false;
      }

    });

  });

</script>

更精明的人会立即注意到我没有调用 HTML5 验证 API,原因是我试图使这个示例保持简单。

我检查用户名值的地方是重要的部分。

重要的是我执行检查的匿名函数返回 true 或 false。 (如果您不返回任何内容,则默认为 True)

如果返回 false,您将阻止回发的发生,从而允许您使用 HTML5 验证 API 更改表单字段所需的任何 JS 代码。

我个人偏好是使用 bootstrap(请参阅我的 Bootstrap 2 书的同步融合免费电子书范围,以及即将发布的 Bootstrap 3 书),您可以在框架中使用特殊的标记和 css 类,例如“has-errors” “给事物适当地着色。

至于使用 JQuery 的组件选择,这里还有两件事需要注意。

  • 1)你不应该在一个网络表单页面上有多个表单,事实上,如果我没记错的话,如果你这样做,你的应用程序将无法编译,或者最多肯定会在运行时抛出异常。

  • 2)因为你只有一种表单,所以你可以非常安全地做出假设,JQuery 中的通用“表单”选择器只会选择你的主表单(无论 ID、名称、缺少或大小)并向其添加 onsubmit 处理程序,将始终附加此after网络表单已经做到了这一点。

  • 3) 因为 Web 表单可以(并且通常)修改 ID 名称,所以使用“数据属性”向标签添加自定义位通常更容易。实际的 ASP.NET js 端验证本身执行完全相同的技巧,以允许 JS 代码和 .NET 代码在同一页面中愉快地共存。有多种方法可以告诉 .NET 如何命名 ID,但通常您必须在很多地方设置很多选项,而且很容易错过其中一个。使用“数据属性”和 JQ 属性选择器语法是实现相同目标的更安全、更易于管理的方法。

Summary

这不是一项困难的任务,但我必须承认,如果您不看看网络表单在您周围构建的栅栏之外,这并不是一个立即显而易见的任务。

Web-forms 专为快速应用程序开发而设计,主要针对习惯桌面 win-forms 模型的开发人员。虽然 Web 表单如今仍然占有一席之地,但对于新的未开发应用程序,我建议也考虑其他选项,尤其是那些构建在新 HTML5 规范正在努力建立和完善的基础上的选项。

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

如何在WebForms中的form.onSubmit期间调用HTML5 form.checkValidity? 的相关文章

  • 使用 PHP 对 ASP.NET 成员身份中的用户进行身份验证

    我在尝试使用 PHP 针对现有 ASP NET 成员资格数据库对用户进行身份验证时遇到一些问题 我在网上搜索过 发现现有的答案似乎对我不起作用 即 public static function Hash password salt deco
  • 如何为本机启用现有 WCF 服务的 JSONP?

    我有一个现有的服务 如下方法 AspNetCompatibilityRequirements RequirementsMode AspNetCompatibilityRequirementsMode Allowed ServiceBehav
  • EditText 中的验证允许 IP 或 Web Url 主机

    我需要对我的 EditText 进行验证 以便它允许我输入有效的 IP 地址格式 即示例 132 0 25 225 or 网址格式 www 例如 www example com 逻辑是 如果用户首先输入任何数值 则验证 IP 将执行操作 否
  • 有没有办法编写屏幕阅读器会忽略的内容?

    我刚刚开发了一个需要视力正常和视障用户都可以访问的页面 内容的某些元素仅与视觉元素相关 因此根本不适用于使用屏幕阅读器的人 例如 链接在新窗口中打开视听演示文稿 但由于我无法控制的情况 窗口的大小被笨拙地调整 因此有一条消息说您应该调整窗口
  • 有没有办法改变输入类型=“日期”格式?

    默认情况下 输入type date 显示日期为YYYY MM DD 问题是 是否可以将其格式强制为 DD MM YYYY 无法更改格式 我们必须区分有线格式和浏览器的表示格式 接线格式 The HTML5日期输入规范 https www w
  • 获取所有查询字符串对并初始化字典的最佳方法

    我想将所有键 值对存储在我的查询字符串中 www example com a 2 b 3 c 34 进入字典 有没有一种快速的方法可以做到这一点 而无需手动循环所有项目 Try HttpUtility ParseQueryString 它给
  • 根据复选框和数据元素隐藏/显示表格行

    我想隐藏表中的行 因为我选中了复选框并且该数据元素在表中不正确 另一个实验 我还可以使用数据元素进行排序并按下拉列表排序 查看 tr 标签 价格 名称 评级 吗 div class filter list div
  • 使用 pkg:sjPlot 函数创建一个生成部分斜体单元格的数据框

    我正在尝试创建一个简单的数据表 其中 Coral taxon 列中的属名称为斜体 而 spp 列中的属名称为斜体 属名后面的部分不大写 我尝试使用 expression 函数对 Coral taxon 的每一行进行编码 但没有成功 sum
  • 滚动时输入自动完成位置错误(chrome)

    我在输入文本的默认自动完成功能方面遇到了一些麻烦 滚动时它不会相应移动 我希望自动完成文本保留在输入的正下方 有办法做到这一点吗 我在 Chrome 浏览器版本 57 0 2987 133 中发生这种情况 fiddle https jsfi
  • 使用日语“Enter”键进行搜索功能

    我在日语方面遇到了问题 我有一个允许用户搜索数据的表单 当用户输入要搜索的字符串并按 Enter 键时 搜索功能就会执行 我的代码是 formSearch input keyup function event var key event c
  • html 表格单元格的条件格式

    是否有现成的解决方案可以对 HTML 表格进行条件格式设置 通过条件格式 我更感兴趣的是根据该列或其他列 在同一个表中 的值 数字 将不同的颜色作为单元格背景 类似于我们在 Excel 条件格式 gt 色阶 gt 红黄绿中的内容 我想在通过
  • ASP.Net 应用程序中的音频/视频/文本聊天

    我需要在 ASP Net 中开发一个聊天系统 我已经浏览了很多关于类似主题的问题 但没有找到任何一个令人满意的 是否可以从头开始创建它 或者我是否需要使用一些 API 我的要求仅限于我的网站用户 可以说基于内联网 请帮我 要进行文字聊天 人
  • 如何动态突出显示网页上的字符串?

    我想创建带有 url 的页面 例如 http xyzcorp schedules 2015Aug24 Aug28 Jim Hawkins http xyzcorp schedules 2015Aug24 Aug28 Billy Bones
  • 如何仅在 css/html 中强制在单词之间换行?

    我只有一段普通的文本 p 标签内的 p div 标签 但只有 Firefox 可以正确显示 Firefox 打破了单词之间的界限 所有其他浏览器都会在单词中间断行 这使得阅读变得困难 这是我的意思的一个例子 火狐浏览器 工作中 This w
  • Chromium 嵌入式框架支持 HTML5 音频吗?

    我一直在玩 CefSharp 但似乎无法播放任何音频 我可以让音频控件出现 但它们保持冻结状态 这些是我使用的版本 Chromium 21 0 1180 0 CEF r728 CefSharp 0 12 4596 50 我先尝试了 mp3
  • Perl:HTTP::微小删除留下损坏的锚标记

    我编写了一个脚本 该脚本收集从数据库读取的缓冲区内的所有 URL 检查该页面是否仍然存在 并使用 HTTP Tiny 从缓冲区中删除 URL 如果该 URL 无法访问或返回无效 问题是 HTTP Tiny 删除左锚标记 例如此处无效的文本
  • 计算文本选择的 xy 位置

    我正在尝试使用 DOM 元素创建自己的文本选择 是的 我的意思是当您在此元素中选择文本时 您会在文本后面看到蓝色背景 这个想法是停止默认行为 蓝色 并使用我自己的元素来完成工作 方法是找到选择的 xy 位置 然后放置绝对定位的元素 我希望能
  • HTML 元素的默认背景颜色是什么?白色还是透明?

    我只是被一个简单的问题困住了 想弄清楚 HTML 元素的默认背景颜色是什么 是白色的还是透明的 默认背景颜色是透明的 看这里 https developer mozilla org en docs Web CSS background co
  • HTML 输入 - 名称与 ID [重复]

    这个问题在这里已经有答案了 使用 HTML 时
  • 如何在表格列标题处垂直旋转文本

    我用过这个数据表 http www datatables net 在我的网页上 这是fiddle http jsfiddle net fxju7 2 链接我放置代码的地方 我想要 第一个数字第二个数字列应该垂直旋转 我已经做到了 但是 问题

随机推荐