2

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

我认为验证器必须存在是有原因的,但是在这种情况下使用它们来验证看起来比不使用它们做的工作要多得多,而且我看不出有任何优势来证明它的合理性。

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

4

5 回答 5

3

经过一番思考,我对这种情况最好的想法是 aWebUserControl将有 aTextBox和 a CustomFieldValidatoror RequiredFieldValidator。然后只需将其拖放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 和使用此解决方案的一个函数。

在 WebUserControl 中使用 RequiredFieldValidators 的结果

于 2012-12-26T23:11:49.903 回答
0

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

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

  • 应用规则
  • 本土化
  • 客户方面的冒犯

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

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

于 2012-12-26T23:32:20.927 回答
0

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

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

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

于 2012-12-26T23:50:39.153 回答
0

我将使用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
  }
}
于 2012-12-27T00:33:35.607 回答
-1

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

于 2012-12-26T22:31:42.997 回答