2009-08-05 6 views
1

J'ai jQuery dans divers fichiers, et récemment j'ai eu besoin de changer des éléments dans la page maître. Cela a causé divers jaavscript inclus pour cesser de fonctionner. Stackoverflow sont suggesting great ideas pour résoudre le problème concernant le sélecteur Get by ID.jQuery.validate.js et les pages maîtres asp.net

$("#ctl00_ContentMainPane_eliteUser").html 

Cependant, j'ai un problème où nous avons utilisé jquery.validate.js pour valider les contrôles de formulaire, donc il y a un code comme celui-ci dans externes fichiers JS

$(document).ready(function(){ 
    $("#aspnetForm").validate({ 
     rules: 
    { 
     ctl00$ContentMainPane$txtFirstName: 
     { 
      required:true, 
      CheckAlfaNumeric:true 
     }, 
     ctl00$ContentMainPane$ctl00$ucRFI$txtComments: 
     { 
      required:true 
     }      

    }, 
    messages: 
    { 
     ctl00$ContentMainPane$txtFirstName: 
     { 
      required:" Please enter first name" 
     }, 
     ctl00$ContentMainPane$ctl00$ucRFI$txtComments: 
     { 
      required:" Please enter comments." 
     } 
    } 
    }); 
    $("#" + GetPlaceholder() + "txtFirstName").blur(function(){ 
      $("#" + GetPlaceholder() + "txtFirstName").valid(); 
    }); 
    jQuery.validator.addMethod("CheckAlfaNumeric", function(value, element) { 
      return this.optional(element) || /^[A-Za-z\ ]+$/i.test(value); 
    }, " Please enter alphabet."); 
}); 

Toute idée comment prévenir le problème de nom des attributs si le nom est modifié en raison de la modification de la page maître?

+0

Voir ma réponse [ici] (http://stackoverflow.com/questions/1232465/how-to-use-jquery-select-element-by-id-and-asp-net-without-putting -ctl00-everyw) – redsquare

Répondre

5

Attendez .NET 4.0, qui vous permet de spécifier exactement comment les ID doivent être construits;)

Sérieusement: vous pouvez AFAIK créer vos règles manuellement, faire quelque chose comme (un objet JS est rien d'autre qu'un " tableau » des propriétés):

var myRules = new Object(); 
myRules[GetPlaceholder() + "txtFirstName"] = { required:true, CheckAlfaNumeric:true }; 

var myMessages = new Object(); 
myMessages[GetPlaceholder() + "txtFirstName"] = { required:"Please enter first name" }; 

$("#aspnetForm").validate({ rules: myRules, messages: myMessages }); 
+0

C'est peut-être le .Net o phile en moi, mais pouvez-vous faire "new Object()" une classe fortement typée ici? – digiguru

+0

non, il n'y a pas un tel concept d'une classe ou un type fort d'ailleurs en JavaScript ... – veggerby

+0

Mec. Vos "myRules" et "myMessages" ont sauvé la journée. Upvote. – granadaCoder

0

Ma réponse est ma modification de Veggerby. S'il vous plaît upvote sa réponse, pas le mien. Il a sauvé la journée.

Je mets ma réponse ici pour ajouter une légère mise en garde. (Je fais le Using 'attr ("nom")). Et de montrer comment le faire avec une liste déroulante. Je n'ai pas vu que ma page de contenu a une liste déroulante asp.net appelée "ddlState" et "ddlFavoriteColor". J'ai mis une valeur "--Select--" factice dans le haut des éléments de la liste déroulante, donc je veux quelque chose où le selectedIndex est supérieur à zéro.

Notez que ce projet est "coincé" avec 3.5. : < J'aurais plutôt fait quelque chose avec les fonctionnalités cool 4.0.

Oui, mon code "check" pourrait être plus petit, mais pour les échantillons web, j'aime être un peu plus verbeux que concis pour montrer ce qui se passe.

function GetStateDropDownName() { 
    var cntlName = $("[id$=_ddlState]").attr("name"); 
    return cntlName; 
} 

function GetFavoriteColorDropDownName() { 
    var cntlName = $("[id$=_ddlFavoriteColor]").attr("name"); 
    return cntlName; 
} 

$(document).ready(function() { 

    jQuery.validator.addMethod("dropdownBoxHasItemSelected", function (value, select, arg) { 
     var returnValue = false; 
     var selectedIndex = $(select).prop("selectedIndex"); 
     if (selectedIndex != 0) { 
      returnValue = true; 
     } 
     return returnValue; 
    }, "Please select a item."); 


    var myRules = new Object(); 
    myRules[GetStateDropDownName()] = { dropdownBoxHasItemSelected: true }; 
    myRules[GetFavoriteColorDropDownName()] = { dropdownBoxHasItemSelected: true }; 

    var myMessages = new Object(); 
    myMessages[GetStateDropDownName()] = { dropdownBoxHasItemSelected: "Please select a State." }; 
    myMessages[GetFavoriteColorDropDownName()] = { dropdownBoxHasItemSelected: "Please select a Favorite Color." }; 


    // Initialize validation on the entire ASP.NET form. 
    $("#aspnetForm").validate({ 
     rules: myRules, messages: myMessages 
    }); 
Questions connexes