我正在制作我的第一个真正的ASP页面,我需要在14个不同的文本框字段中验证一天中的时间(两者都存在一个值,并且该值最终在0:00:00-23之间: 59:59)。我认为编写验证函数然后在某个时刻(即当用户点击“提交”时,或在TextChanged事件处理程序中)显式调用它而不是添加14个自定义验证器或14范围(或RegEx)验证器和14个必填字段验证器。
我认为验证者必须存在是有原因的,但在这种情况下使用它们进行验证看起来比不使用它们要做更多的工作,我看不出任何有利的理由来证明它。
我没有看到ASP.NET验证器的优势吗?在ASP标记中制作14个相同验证器的副本似乎不是一个好的解决方案。
答案 0 :(得分:3)
经过一些思考,我对这个场景最好的想法是WebUserControl
,它会有TextBox
和CustomFieldValidator
或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和使用这个解决方案的一个函数。
答案 1 :(得分:0)
如果可能的话,请继续使用ASP.NET验证程序。
其他人很容易看到你在做什么:
如果我需要处理相同的东西14次,我也会担心重复的代码。但即使您编写文本框的代码也是如此。我会以动态的方式将控件(文本框和验证器)放在代码隐藏的页面上。这不是ASP.NET最简单的部分,但从长远来看它会对你有所帮助。
请在此处查看您的操作方法。 http://geekswithblogs.net/shahed/archive/2008/06/26/123391.aspx
答案 2 :(得分:0)
恕我直言,我主要将ASP.Net验证器视为“服务器端”验证 - 正如您所说 - “提交后”/回发。
在您的具体情况下,如果您需要14个盒子(必需+范围)的相同例程,使用ASP.Net验证器进行客户端验证的优势可以被其他客户“替换”侧面选项(例如jQuery验证),以便您可以(重新)获得它并仍然维护服务器端验证(并完成14个用途的单服务器端例程 - 也称为“自定义验证”)。
客户端验证的“好处”(无论是通过ASP.Net验证器还是其他一些框架)是条目被验证,因为它们是由用户提供的(没有回发/提交),并且提交本身也是如此 - 那里没有服务器工作/回发,直到客户端的验证完成(你将工作交给客户端,而不是所有服务器,并且,不必连接14个验证器执行相同的例程)。
答案 3 :(得分: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
}
}
答案 4 :(得分:-1)
你为什么要做已经完成的事情? Asp.net验证器提供客户端和服务器端验证。干 - 别重复自己。只需使用ASP.net验证器