当附加到文本框的必需字段验证程序未通过客户端验证时,如何执行一些JavaScript?我想要做的是更改文本框的CSS类,以使文本框的边框显示为红色。ASP.NET验证失败时更改文本框的CSS类
我正在使用webforms,我有jquery库可供我使用。
当附加到文本框的必需字段验证程序未通过客户端验证时,如何执行一些JavaScript?我想要做的是更改文本框的CSS类,以使文本框的边框显示为红色。ASP.NET验证失败时更改文本框的CSS类
我正在使用webforms,我有jquery库可供我使用。
这里是快速和肮脏的东西(但它的作品!)
<form id="form1" runat="server">
<asp:TextBox ID="txtOne" runat="server" />
<asp:RequiredFieldValidator ID="rfv" runat="server"
ControlToValidate="txtOne" Text="SomeText 1" />
<asp:TextBox ID="txtTwo" runat="server" />
<asp:RequiredFieldValidator ID="rfv2" runat="server"
ControlToValidate="txtTwo" Text="SomeText 2" />
<asp:Button ID="btnOne" runat="server" OnClientClick="return BtnClick();"
Text="Click" CausesValidation="true" />
</form>
<script type="text/javascript">
function BtnClick() {
//var v1 = "#<%= rfv.ClientID %>";
//var v2 = "#<%= rfv2.ClientID %>";
var val = Page_ClientValidate();
if (!val) {
var i = 0;
for (; i < Page_Validators.length; i++) {
if (!Page_Validators[i].isvalid) {
$("#" + Page_Validators[i].controltovalidate)
.css("background-color", "red");
}
}
}
return val;
}
</script>
我想你会想使用Custom Validator,然后使用ClientValidationFunction ...除非它有助于在失败时添加一个css类。
重要提示:这不适用于检查字段是否为空;如果要检查的字段为空,则不会触发CustomValidator。 :-( – Jez 2010-12-13 15:52:07
或者,只是通过页面控件迭代如下:(需要使用System.Collections.Generic引用)
const string CSSCLASS = " error";
protected static Control FindControlIterative(Control root, string id)
{
Control ctl = root;
LinkedList<Control> ctls = new LinkedList<Control>();
while (ctl != null)
{
if (ctl.ID == id) return ctl;
foreach (Control child in ctl.Controls)
{
if (child.ID == id) return child;
if (child.HasControls()) ctls.AddLast(child);
}
ctl = ctls.First.Value;
ctls.Remove(ctl);
}
return null;
}
protected void Page_PreRender(object sender, EventArgs e)
{
//Add css classes to invalid items
if (Page.IsPostBack && !Page.IsValid)
{
foreach (BaseValidator item in Page.Validators)
{
var ctrltoVal = (WebControl)FindControlIterative(Page.Form, item.ControlToValidate);
if (!item.IsValid) ctrltoVal.CssClass += " N";
else ctrltoVal.CssClass.Replace(" N", "");
}
}
}
应该适用于大多数情况,并且意味着您添加验证程序时不必更新它。我将这段代码添加到了一个cstom Pageclass中,因此它在我添加了验证器的任何页面上运行站点范围。
对于遍历页面上的每个控件都非常低效,我认为您不应该这样做。 – 2012-08-30 10:06:31
前段时间我花了几个小时,从那以后我一直在使用一些自定义的js魔术来实现这一点。
实际上很简单,并且以ASP.NET验证的方式工作。基本的想法是添加一个CSS类来在每个控件上附加一个javascript事件,以便快速获得视觉反馈。
<script type="text/javascript" language="javascript">
/* Color ASP NET validation */
function validateColor(obj) {
var valid = obj.Validators;
var isValid = true;
for (i in valid)
if (!valid[i].isvalid)
isValid = false;
if (!isValid)
$(obj).addClass('novalid', 1000);
else
$(obj).removeClass('novalid', 1000);
}
$(document).ready(function() {
$(".validateColor").change(function() {validateColor(this);});
});
</script>
例如,这将是在ASP.Net文本框控件上添加的代码。是的,你可以放置尽可能多的,它只会意味着添加一个CssClass值。
<asp:TextBox ID="txtBxEmail" runat="server" CssClass="validateColor" />
它是什么触发ASP.Net客户端验证时,有关于工作控制权的变更和应用CSS类,如果它是无效的。所以要定制可视化,你可以依靠css。
.novalid {
border: 2px solid #D00000;
}
它并不完美,但几乎:)和至少你的代码将不会从多余的东西受到影响。最好的,可以与各种Asp.Net验证器,事件自定义器一起使用。
我还没有看到类似这个谷歌搜索的东西,所以我不想与你分享我的诡计。希望能帮助到你。
在服务器端额外的东西:
使用此我也从代码中添加此“.novalid” CSS类时需要的东西一些特定的验证,也许可以在服务器端只检查后面一段时间后这样:
Page.Validate();
if (!requiredFecha.IsValid || !CustomValidateFecha.IsValid)
txtFecha.CssClass = "validateColor novalid";
else
txtFecha.CssClass = "validateColor";
如果用户不输入任何内容并发布页面,该代码将不会在提交时生效... – 2014-06-29 14:26:34
@HananG我很久以前写过这篇文章,但主要想在标准的ASP.net控件上添加一些行为。我想你可以在任何提交元素上添加一些onClick行为来触发调用函数。 – guillem 2014-06-29 18:01:13
嗯,是的,谢谢。但我想这会导致相同的错误,因为我问这里:http://stackoverflow.com/questions/24477219/asp-net-issue-with-chaining-required-field-and-regular-expression-validators-f – 2014-06-30 09:18:22
这是我的解决方案。
优于其他解决方案:
缺点:
如何使用:
申报了 “control_validation_error” CSS类
function Validation_Load() {
if (typeof (Page_Validators) != "object") {
return;
}
for (var i = 0; i < Page_Validators.length; i++) {
var val = Page_Validators[i];
var control = $("#" + val.controltovalidate);
if (control.length > 0) {
var tagName = control[0].tagName;
if (tagName != "INPUT" && tagName != "TEXTAREA" && tagName != "SELECT") {
// Validate sub controls
}
else {
// Validate the control
control.change(function() {
var validators = this.Validators;
if (typeof (validators) == "object") {
var isvalid = true;
for (var k = 0; k < validators.length; k++) {
var val = validators[k];
if (val.isvalid != true) {
isvalid = false;
break;
}
}
if (isvalid == true) {
// Clear the error
$(this).removeClass("control_validation_error");
}
else {
// Show the error
$(this).addClass("control_validation_error");
}
}
});
}
}
}
}
你可以使用下面的脚本:
<script>
$(function(){
if (typeof ValidatorUpdateDisplay != 'undefined') {
var originalValidatorUpdateDisplay = ValidatorUpdateDisplay;
ValidatorUpdateDisplay = function (val) {
if (!val.isvalid) {
$("#" + val.controltovalidate).css("border", "2px solid red");
}
originalValidatorUpdateDisplay(val);
}
}
});
</script>
此代码装饰原始的ValidatorUpdateDisplay函数respon sible更新验证器的显示,并根据需要更新controltovalidate。
希望这会有所帮助,
为了使自定义样式更容易,你可以这样做:$(“#”+ val.controltovalidate).toggleClass('error',!val.isvalid); – 2013-03-05 12:44:15
+1为我节省了一些Google时间,谢谢gsimoes和@GrimaceofDespair – CResults 2013-07-29 04:52:12
我认为你的v1和v2变量是未使用的:P – billy 2012-07-23 14:35:39
是的,但这是快速和**脏**:D。只是评论他们。 – TheVillageIdiot 2012-07-24 17:43:29
也许很脏,但我还没有找到更好的解决方案! :P – billy 2012-07-24 20:58:59