當附加到文本框的必需字段驗證程序未通過客戶端驗證時,如何執行一些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