【问题标题】:Why validate with ASP.NET Validators?为什么使用 ASP.NET 验证器进行验证?
【发布时间】:2012-12-26 22:29:02
【问题描述】:

我正在制作我的第一个真正的 ASP 页面,我需要在 14 个不同的文本框字段中验证一天中的某个时间(两者都存在一个值,并且该值最终在 0:00:00-23 之间: 59:59)。我在想写一个验证函数然后在某个时候显式调用它会容易得多(即当用户点击“提交”时,或者在 TextChanged 事件处理程序中)而不是添加 14 个自定义验证器或 14 个范围(或 RegEx)验证器和 14 个必填字段验证器。

我认为验证器的存在是有原因的,但在这种情况下使用它们来验证看起来比不使用它们做的工作要多得多,我看不出有什么好处来证明它的合理性。

ASP.NET 验证器有我没有看到的优势吗?在 ASP 标记中制作 14 个相同验证器的副本似乎不是一个好的解决方案。

【问题讨论】:

  • 大多数情况下,页面上只有一个日期需要验证,或者可能是开始日期和结束日期。您的验证函数方法似乎很明智。
  • 为什么要复制 14 个文本框?这不是批评只是一个问题:)
  • 这是一种设置支持电话号码的打开和关闭时间的表格 - 每天都需要一个开始和停止时间,他们想要它,以便每天都有不同的电话打开/关闭时间.
  • 看看this。它可能会为您提供一些提高应用程序可维护性的想法。

标签: c# asp.net validation textbox


【解决方案1】:

经过一番思考,我对这种情况的最佳想法是WebUserControl,它将有一个TextBox 和一个CustomFieldValidatorRequiredFieldValidator。然后只需将WebUserControl 拖放到您的页面中即可。这是一个使用RequiredFieldValidator 的简单示例。

ASCX 文件(WebControl):

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SelfValidationTextBox.ascx.cs" Inherits="SelfValidationTextBox" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="* Required Field"></asp:RequiredFieldValidator>

ASPX 文件:

<%@ Register Src="SelfValidationTextBox.ascx" TagName="SelfValidationTextBox" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox1" runat="server" />
    <br />
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox2" runat="server" />
    <br />
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox3" runat="server" />
    <br />
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox4" runat="server" />
    <br />
    <uc1:SelfValidationTextBox ID="SelfValidationTextBox5" runat="server" />
    <br />
    <br />
    <asp:Button ID="Button1" runat="server" Text="Click Me" />
    </form>
</body>
</html>

我认为这将是一个很好的解决方法,您甚至可以按照您的建议使用 CustomFieldValidators 和使用此解决方案的一个函数。

【讨论】:

    【解决方案2】:

    如果可能,请使用 ASP.NET 验证器。

    其他人很容易看到你在做什么:

    • 应用规则
    • 本地化
    • 客户端攻击

    如果我需要处理相同的东西 14 次,我也会担心重复的代码。但即使您为文本框编写代码也是如此。我会以动态方式将控件(文本框和验证器)从代码隐藏放置在页面上。这不是 ASP.NET 中最简单的部分,但从长远来看它会对您有所帮助。

    在这里看看你是怎么做的。 http://geekswithblogs.net/shahed/archive/2008/06/26/123391.aspx

    【讨论】:

      【解决方案3】:

      恕我直言,我主要将 ASP.Net 验证器视为“服务器端”验证——正如你所说的——“提交后”/回发。

      在您的特定情况下,如果您需要 14 个框(必需 + 范围)的相同例程,则使用 ASP.Net 验证器进行 客户端 验证的优势可以被其他客户端“替换”辅助选项(例如 jQuery 验证),以便您可以(重新)获得它并仍然维护服务器端验证(并完成 14 次使用的单服务器端例程 - 也称为“自定义验证”)。

      客户端验证的“优势”(无论是通过 ASP.Net 验证器还是其他框架)是在用户提供条目时对其进行验证(无回发/提交),并且在提交本身时也是如此 - 那里在客户端验证完成之前没有服务器工作/回发(您将工作交给客户端,而不是全部在服务器上,并且不必连接 14 个验证器执行相同的例程)。

      【讨论】:

        【解决方案4】:

        我将使用Repeater 控件并将其绑定到将保存每个项目的数据的对象列表。您可以在后面的代码中轻松快速地完成这一切,并且验证将在客户端和服务器端都有效,换句话说,如果用户关闭 javascript,它将有效。

        定义一个数据类,例如:

          public class InputDataItem
          {
            public string Text { get; set; }
        
            public InputDataItem()
            {
            }
        
            public InputDataItem(string text)
            {
              this.Text = text;
            }
          }
        

        和标记:

        <asp:Repeater ID="rptInputs" runat="server">
          <ItemTemplate>
            <asp:TextBox ID="tbxInput" runat="server" Text='<%# Eval("Text") %>'></asp:TextBox>
            <asp:RequiredFieldValidator ID="rqfValidator" runat="server" ControlToValidate="tbxInput" ErrorMessage="* Required!"></asp:RequiredFieldValidator>
          </ItemTemplate>
        </asp:Repeater>
        <br />
        <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
        

        并绑定转发器并获取用户使用此代码输入的值

        protected void Page_Init(object sender, EventArgs e)
        {
          if (!IsPostBack)
          {
            var data = new List<InputDataItem>();
            for (int i = 0; i < 5; i++)
            {
              data.Add(new InputDataItem("Item " + i.ToString()));
            }
            rptInputs.DataSource = data;
            rptInputs.DataBind();
          }
        }
        
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
          if (IsValid)
          {
            var data = new List<InputDataItem>();
            foreach (RepeaterItem rit in rptInputs.Items)
            {
              Control cnt = rit.FindControl("tbxInput");
              if (cnt != null && cnt is TextBox)
                data.Add(new InputDataItem((cnt as TextBox).Text));
            }
            /// here you have list of POCO objects filled with user input
          }
        }
        

        【讨论】:

          【解决方案5】:

          为什么要做已经完成的事情? Asp.net 验证器提供客户端和服务器端验证。干燥 - 不要重复自己。只需使用 ASP.net 验证器

          【讨论】:

          • 在这种特定情况下,我不想自己使用 14 个海关验证器。他说:“我认为验证器的存在是有原因的,但在这种情况下使用它们进行验证看起来比不使用它们做的工作要多得多,而且我看不出有任何优势来证明它的合理性。”
          • 好吧,尽管他将编写 14 个自定义函数(客户端和服务器端),但他将获得自动调用(验证)、错误消息显示等优势。我会使用 ASP.net 验证器。无论如何,您将自己编写 14 种不同的验证
          • 他只需要编写一个验证函数,并使用相同的函数验证每个文本框。然而,他最多只能从 14 个不同的地方调用它。
          • 我实际上只是要编写 1 个验证函数,它遍历所有 TextBox 控件并在用户点击“提交”时验证每个文本框的内容。如果它们都有效,则操作继续。如果有任何失败,我会停止操作并在页面顶部显示一个隐藏标签,并显示错误消息。
          猜你喜欢
          • 2011-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-13
          • 2016-09-09
          • 1970-01-01
          相关资源
          最近更新 更多