`
varsoft
  • 浏览: 2508970 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[原创]ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation

阅读更多
一 、实现的效果

我想对于ASP.NET的Validator控件已经熟悉的不能再熟悉了。我们 已经习惯了用Validator控件来验证我们在表单的输入,并通过ValidationSummary来输出我们为Validator控件设置的Error message。不知道大家有没想过进一步改进一下我们的Validation来改善我们的User Experience。比如,在ValidationSummary输出一个Link连接到对应的控件,而不是显示单纯的Error message。


比如在上图中,是一个典型的Login的Page。我们有两个必填的字段:User name和Password。为此我定义两个RequiredFieldValidator。他们的Error message分别为:”User name is mandatory!”和”Password is mandatory!”。在未输入任何值得前提下Click “Sign in”按钮,Error Message被显示在ValidationSummary上面。不过和传统的Error message不同,显示在ValidationSummary上的实际上是两个链接,Click对应的Error message,光标会设置到对应的Textbox上。比如上图所示:Click ”User name is mandatory!”,光标回到User name对应的Texbox。

二、具体实现

现在我们来简单叙述上面的效果是如果实现的,在开始之前我想说的是,方法非常简单—或许你已经猜到了:)

1.首先来看看aspx。

<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Login.aspx.cs"Inherits="Login"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headid="Head1"runat="server">
<title>Login</title>
<styletype="text/css">
body
{}{font-family:Verdana;font-size:10px}
table
{}{width:300px}
tabletr
{}{height:30px}
tabletd.firstColumn
{}{width:100px;text-align:right}
tabletd.secondColumn
{}{text-align:left}
tablespan.asterisk
{}{color:red}
table.textbox
{}{width:150px;border:solid1px#999999}
table.button
{}{background-color:#00cc66;border:solid1px#999999}
ulli
{}{margin-bottom:5px}
ullia
{}{color:red;text-decoration:none}
ullia:hover
{}{text-decoration:underline}
</style>

<scripttype="text/javascript">
functionsetFocus(control)
{
varcontrolToValidate=document.getElementById(control);
controlToValidate.focus();
}


</script>
</head>
<bodystyle="font-family:Verdana">
<formid="form1"runat="server">
<div>
<tablecellpadding="0"cellspacing="5px">
<tr>
<tdcolspan="2">
<asp:ValidationSummaryrunat="server"ID="vldLogin"/>
</td>
</tr>
<tr>
<tdclass="firstColumn">
UserName:
<spanclass="asterisk">&nbsp;*</span></td>
<tdclass="secondColumn">
<asp:TextBoxrunat="server"ID="txtUserName"CssClass="textbox"></asp:TextBox>
<asp:RequiredFieldValidatorrunat="server"ID="rqfUserName"ControlToValidate="txtUserName"Display="None"></asp:RequiredFieldValidator>
<asp:CustomValidatorrunat="server"ID="ctmUserName"Display="None"OnServerValidate="ctmUserName_ServerValidate"ControlToValidate="txtUserName"></asp:CustomValidator>
</td>
</tr>
<tr>
<tdclass="firstColumn">
Password:
<spanclass="asterisk">&nbsp;*</span></td>
<tdclass="secondColumn">
<asp:TextBoxrunat="server"ID="txtPassword"TextMode="Password"CssClass="textbox"></asp:TextBox>
<asp:RequiredFieldValidatorrunat="server"ID="rqfPassword"ControlToValidate="txtPassword"Display="None"></asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<tdcolspan="2"align="center">
<asp:Buttonrunat="server"ID="btnSignIn"Text="Signin"CssClass="button"/>&nbsp;&nbsp;&nbsp;
<asp:Buttonrunat="server"ID="ButtonCancel"Text="Cancel"CausesValidation="false"
CssClass
="button"/>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>

在看到了上面的Screen shot之后再看看上面的Html,结构清晰得一目了然。所以我就不再进一步解释了。在这里我只需要提提定义在aspx的一段javascript function:setFocus。通过它把focus设置到指定的控件。

<scripttype="text/javascript">
functionsetFocus(control)
{
varcontrolToValidate=document.getElementById(control);
controlToValidate.focus();
}

</script>

2.接着我们来看看code behind。


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;

publicpartialclassLogin:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
if(this.IsPostBack)
{
return;
}


this.rqfUserName.ErrorMessage=string.Format("{0}ismandatory!","Username");
this.rqfPassword.ErrorMessage=string.Format("{0}ismandatory!","Password");
this.ctmUserName.ErrorMessage="Suchauserhasnotregistered!";

this.MakeClickableErrorMessage();
}


privatevoidMakeClickableErrorMessage()
{
foreach(BaseValidatorvalidatorinthis.Validators)
{
if(validator.ControlToValidate==string.Empty)
{
continue;
}

stringclientID=this.FindControl(validator.ControlToValidate).ClientID;
stringscript=string.Format("<ahref=\"javascript:setFocus('{0}');\">{1}</a>",clientID,validator.ErrorMessage);
validator.ErrorMessage
=script;
}

}


protectedvoidctmUserName_ServerValidate(objectsource,ServerValidateEventArgsargs)
{
if(this.txtUserName.Text.Trim()!="adm")
{
args.IsValid
=false;
return;
}


args.IsValid
=true;
}

}

Code也简单得一塌糊涂,除了MakeClickableErrorMessage这个Method,其他的都不值一提。

privatevoidMakeClickableErrorMessage()
{
foreach(BaseValidatorvalidatorinthis.Validators)
{
if(validator.ControlToValidate==string.Empty)
{
continue;
}

stringclientID=this.FindControl(validator.ControlToValidate).ClientID;
stringscript=string.Format("<ahref=\"javascript:setFocus('{0}');\">{1}</a>",clientID,validator.ErrorMessage);
validator.ErrorMessage
=script;
}

}

显示在ValidationSummary中原本简单的literal error message就是通过上面的这个MakeClickableErrorMessage转变成hyperlink的。在上面的code中,我遍历page中的每个Validator control。如果该Validator control有对应ControlToValidate(对于一个Validator control来说,ControlToValidate并非一个必需的property,如果没有指定该property,其值为空字符串),直接进入下一个循环。然后我把原来只是弹出的文本转变成一个<a></a>,然后再将其重新赋值给对应的Validator contorl的ErrorMessage property。

比如对于rqfUserNameRequiredFieldValidator来说,原来的Error message是”User name is mandatory!”,那么现在的Error message变成了:

<ahref=”javascript:setFocus(‘txtUserName’);”>Usernameismandatory!</a>

三、ASP.NET是如何实现Validation的

上面只是一个简单的小窍门,我们以这个Sample为例,来进一步介绍ASP.NET如何尽心Validation的。为了简单起见,在这里我没法讨论所有的Validator control。只介绍RequiredFieldValidator和CustomValidator这两种Validator control的处理流程。

1.Client side Validation

我们通过IE来浏览上面的Page,通过参看Source code,可以看到最后Render出来的html:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
http://www.cnblogs.c
分享到:
评论

相关推荐

    电子邮件发送模块源码(asp.net)

    本文将深入探讨ASP.NET中的电子邮件发送实现,以及如何利用提供的源码进行部署和使用。 在ASP.NET中,发送电子邮件主要依赖于`System.Net.Mail`命名空间中的类。`SmtpClient`类是发送电子邮件的核心,它负责与SMTP...

    陈越、何钦铭-数据结构作业6:Reversing Linked List链表翻转

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→...

    [Linked Data] Linked Data 英文版

    Linked Data presents the Linked Data model in plain jargon free language to Web developers Avoiding the overly academic terminology of the Semantic Web this new book presents practical techniques ...

    Visual_Basic_.NET_编写的_Single_Linked_List

    ### Visual Basic .NET 编写的 Single Linked List:深入解析与实现细节 在计算机科学中,链表(Linked List)是一种...通过对`SingleLinkedList`和`Item`类的深入理解,开发者可以更有效地利用单链表来解决实际问题。

    C#使用SMTP服务器发送邮件

    C#提供了System.Net.Mail命名空间,其中包含MailMessage和SmtpClient类,使我们能够方便地创建和发送邮件。下面将详细介绍如何在C#中实现这一功能,以及如何添加附件和使用HTML格式。 首先,我们需要引入必要的命名...

    数据结构英文教学课件:Linked List-exercise.ppt

    数据结构英文教学课件:Linked List-exercise.ppt

    学士后.net项目一资源管理器张光100分

    《学士后.NET项目一:资源管理器》是由张光老师精心制作的,旨在帮助学习者深入理解并掌握.NET框架下的资源管理技术。这个项目在学士后平台的第二单元中占据重要地位,并且因其全面性和实用性获得了满分的评价。通过...

    vue-local-scope::linked_paperclips:在模板中生成本地作用域,以从其他作用域插槽中计算数据,或者只是在模板中包含变量

    :linked_paperclips: 在模板中生成本地范围,以从其他范围的插槽中计算数据 安装 npm install vue-local-scope 为什么? 使用,通常只能访问模板中的数据。 但是有时候,您仍然需要对数据进行转换,例如在数组或...

    数据结构英文教学课件:chapter3 Linked Lists.ppt

    数据结构英文教学课件:chapter3 Linked Lists.ppt

    asp2dotnet:蛮力ASP到VB.NET转换器

    asp2dotnet ##安装## git clone ...--rabbit-hole = Follow linked ASP pages and try and process the whole site. --verbose = Print more stuff to the screen --project

    Linked List 链表 基础

    为了深入理解链表,必须具备一定的指针和内存管理基础。在链表中,节点是由动态分配的内存块组成,因此需要通过指针来管理和操作这些内存块。理解如何正确地分配和释放内存,以及如何避免内存泄漏等问题,是学习链表...

    android-static-analysis-plugin::linked_paperclips:Android大杂烩静态代码质量检查工具Gradle插件

    android-static-analysis-plugin Android hodgepodge静态代码质量检查工具gradle插件。 (。&gt;﹏&lt;。) Gradle project build.gradle dependencies { ...} module build.gradle ... ${project.buildDir}/android-...

    .Net 邮件发送.rar

    《.Net邮件发送详解》 ...配合压缩包中的示例资源,可以更深入地理解和实践.NET邮件发送的各个方面。在实际项目中,根据需求选择合适的SMTP服务器配置、邮件格式和附件管理,能够高效地实现各种邮件功能。

    邮件发送实例

    在这个邮件发送实例中,我们将探讨如何利用ASP.NET的特性来创建一个简单的邮件发送系统。 首先,我们需要了解ASP.NET中的SMTP(Simple Mail Transfer Protocol)服务,它是用于发送电子邮件的标准协议。在ASP.NET中...

    ASP封装成DLL

    ASP 封装成 DLL 服务器端组件 本文档主要讲述了如何将 ASP 封装成 DLL 服务器端组件,从而实现 ASP 程序...本文档提供了将 ASP 封装成 DLL 服务器端组件的详细步骤和方法,能够帮助开发者更好地理解和使用 ASP 技术。

    Arduino 遇到 MATLAB:Matlab Linked to Arduino-matlab开发

    当前提交的内容展示了一种将流行的开源 arduino 板与 MATLAB 结合使用的方法,展示了实时数据采集和可视化的功能。 基于 ATMEGA 328 的 Arduino Demilanove 用于通过串行接口发送一系列时间序列,matlab 代码获取...

    linkedlist_binaryTree.rar_Creating_linkedlist_vb.net list

    在VB.Net 2005环境下,开发数据结构如链表(linked list)和二叉树(binary tree)是常见的编程任务,这对于理解和实现算法至关重要。在这个“linkedlist_binaryTree.rar”压缩包中,包含了创建链表(包括单向链表和...

    linked : The New Science of Networks

    该书描述了网络页面链接之间的复杂系统,非常不错的经典书籍。

    ODAC 5.1.0.6

    property Options.Net: Boolean; TOraDataSet property OptionsDS.FieldsOrigin: Boolean; property OptionsDS.DefaultValues: Boolean; TOraTable property MasterFields: String; property DetailFields: String;...

Global site tag (gtag.js) - Google Analytics