Главные страницы jQuery.validate.js и asp.net

У меня есть jQuery в разных файлах, и недавно мне потребовалось изменить элементы на главной странице. Это привело к тому, что различные включения jaavscript перестали работать. Stackoverflow - это отличные идеи для решения проблемы, связанной с селектором получения по идентификатору.

$("#ctl00_ContentMainPane_eliteUser").html

Однако у меня проблема, когда мы использовали jquery.validate.js для проверки элементов управления формы, поэтому такой код есть в внешних файлах 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.");
});

Есть идеи, как предотвратить проблему именования атрибутов, если имя изменится из-за изменения главной страницы?


person digiguru    schedule 05.08.2009    source источник
comment
См. Мой ответ здесь   -  person redsquare    schedule 05.08.2009


Ответы (3)


Подождите, пока появится .NET 4.0, который позволит вам точно указать, как должны быть построены идентификаторы;)

Серьезно: вы можете AFAIK создавать свои правила вручную, делая что-то вроде (объект JS - это не что иное, как «массив» свойств):

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 });
person veggerby    schedule 05.08.2009
comment
Возможно, во мне это просто .Net o phile, но можете ли вы сделать здесь new Object () строго типизированным классом? - person digiguru; 05.08.2009
comment
нет, в JavaScript нет такой концепции класса или сильного типа в этом отношении ... - person veggerby; 05.08.2009
comment
Чувак. Ваши myRules и myMessages спасли положение. Голосовать за. - person granadaCoder; 28.03.2013

Вы смотрели http://weblogs.asp.net/psperanza/archive/2009/05/07/jquery-selectors-selecting-elements-by-a-partial-id.aspx для частичных совпадений в jQuery .
Единственный другой вариант, который я вижу, - это добавить содержимое js-файла на страницу и использовать что-нибудь ‹% = txtFirstName.ClientID%>

person Podge    schedule 05.08.2009

Мой ответ - моя модификация veggerby. Пожалуйста, проголосуйте за его ответ, а не за мой. Он спас положение.

Я помещаю здесь свой ответ, чтобы добавить небольшое предостережение. (Я использую "attr (" имя ")). И показать, как это сделать, с помощью выпадающего списка.

Не видно, что на моей странице содержимого есть выпадающий список asp.net с именами «ddlState» и «ddlFavoriteColor». Я помещаю фиктивное значение «--Select--» в верхнюю часть элементов раскрывающегося списка, поэтому мне нужно что-то, где selectedIndex больше нуля.

Обратите внимание, этот проект "застрял" на версии 3.5. : ‹Я бы лучше сделал что-нибудь с крутыми функциями 4.0.

Да, мой «проверочный» код мог бы быть меньше, но для веб-примеров я предпочитаю быть немного подробным или кратким, чтобы показать, что происходит.

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
    });
person granadaCoder    schedule 28.03.2013