отключить валидатор asp.net с помощью jquery

14

Я пытаюсь отключить валидаторы с помощью jquery.

Я уже посмотрел Отключить валидаторы ASP.NET с помощью JavaScript и несколько других делают то же самое.

Кажется, он работает, но его разрыв.

Мой код:

$('.c_MyValdiators').each(function() {

    var x = $(this).attr('id');
    var y = document.getElementById(x);
    ValidatorEnable(y[0], false);
});

Я получаю сообщение об ошибке: val undefined [Разрыв этой ошибки] val.enabled = (enable!= False);\r\n

В качестве альтернативы, если я использую

$('.c_MyValdiators').each(function() {
    ValidatorEnable($(this), false); OR ValidatorEnable($(this[0]), false);
  });

Я получаю сообщение об ошибке:

val.style undefined [Прерывать эту ошибку] ​​val.style.visibility = val.isvalid? "скрытый": "видимый"; \r\n

Любая идея или предложения?

  • 1
    В качестве основного совета по устранению неполадок, вы можете сначала захотеть увидеть, что передается вашей функции. Что возвращает x или y?

8 ответов

6
Лучший ответ

Я верю, что ValidatorEnable принимает идентификатор ASP.net, а не идентификатор ClientID, созданный ASP.net. Вам также необходимо сделать проверку правильности в CodeBehind.

вот пример:

Особое использование - возможность включать или отключать валидаторы. Если у вас есть проверка, что вы хотите активировать только в определенных сценариях, вам может потребоваться изменить активацию как на сервере, так и на клиенте, или вы обнаружите, что пользователь не может отправить страницу.

Вот предыдущий пример с полем, которое должно быть проверено только при снятой флажке:

public class Conditional : Page {
    public HtmlInputCheckBox chkSameAs;
    public RequiredFieldValidator rfvalShipAddress;
    public override void Validate() {
        bool enableShip = !chkSameAs.Checked;
        rfvalShipAddress.Enabled = enableShip;
        base.Validate();
    }
}

Вот эквивалент клиентской стороны:

<input type=checkbox runat=server id=chkSameAs 
   onclick="OnChangeSameAs();" >Same as Billing<br>
<script language=javascript>
function OnChangeSameAs() {
    var enableShip = !event.srcElement.status;
    ValidatorEnable(rfvalShipAddress, enableShip);
}
</script>

Ссылка: http://msdn.microsoft.com/en-us/library/aa479045.aspx

  • 2
    Спасибо за ваш ответ. Ссылка MSDN хороша для будущего использования. У меня нет каких-либо validate (), чтобы переопределить, так как я в файле ascx. Я только что получил его после многих попыток, используя: ValidatorEnable (document.getElementById ($ (this) .attr ('id')), true); Есть еще одна проблема, так как это просто включение / отключение на стороне клиента, как я могу отключить мои валидаторы, так как они отключены при обратной передаче страницы? есть идеи?
  • 0
    Вы можете просто создать CustomValidator с пользовательским сценарием на стороне клиента, который проверяет на основе условия. Ссылка, которую я разместил выше, показывает, как это сделать.
6

Я только что наткнулся на ваш вопрос [через год]. Я тоже хотел отключить все валидаторы на странице с помощью JQuery, вот как я справился с ней.

$('span[evaluationfunction]').each(function(){ValidatorEnable(this,false);});

Я ищу каждый пролет на странице с атрибутом функции оценки, затем вызываю ValidatorEnabled для каждого из них.

Я думаю, что часть кода ('this') вашего кода является причиной hickup.

2

У меня есть другое решение, которое должно использовать свойство "enabled" тега span для валидатора. У меня были разные divs в форме, которая отображалась бы или скрывалась, поэтому мне нужно было отключить проверку для полей внутри скрытого div. Это решение отключает проверку, не запуская их.

Если у вас есть набор элементов RequiredFieldvalidator, которые содержат общую строку, которую вы можете использовать для захвата, это jquery:

$("[id*='CommonString']").each(function() {
    this.enabled = false;   // Disable Validation
});

or

$("[id*='CommonString']").each(function() {
    this.enabled = true;    // Enable Validation
});

Надеюсь, что это поможет.

Джон

2
ValidatorEnable(document.getElementById($(this).attr('id')), true); 
1

Я просто сталкиваюсь с той же проблемой, благодаря другим ответам, поскольку это помогло выявить проблему, но они не стали подробно обсуждать почему.

Я считаю, что это связано с тем, что ValidatorEnable() ожидает объект DOM (т.е. объект управления проверкой), противоположный идентификатору.

$(selector).each() устанавливает "this" в элемент DOM, который в настоящее время выполняется итерацией по i.e, указанному в документации jquery:

"Что еще более важно, обратный вызов запускается в контексте текущего DOM, поэтому ключевое слово this относится к элементу." - http://api.jquery.com/each/

Поэтому вам нужно не: document.getElementById($(this).attr('id')

И вместо этого ValidatorEnable(this, true); отлично.

Интересно, что в ответе Russ упоминалось о необходимости также отключить проверку на стороне сервера, что имеет смысл - но мне не нужно было делать это (что касается!).

Отмените мой предыдущий комментарий, потому что раньше я отключил серверную сторону.

0

Различные способы этого зависят от ваших потребностей. Некоторые решения в следующих блогах:

http://imjo.hn/2013/03/28/javascript-disable-hidden-net-validators/

http://codeclimber.net.nz/archive/2008/05/14/How-to-manage-ASP.NET-validation-from-Javascript-with-jQuery.aspx

0

Вот простой способ справиться с этим.

Добавить новый класс в элемент управления Validation.

Затем найдите этот класс с jquery и отключите элемент управления.

Пример:

if (storageOnly == 1)
   {
        $('#tblAssignment tr.assdetails').addClass('hidden');

        $('span[evaluationfunction]').each(function ()
        {
            if ($(this).hasClass('assdetail'))
            { ValidatorEnable(this, false); }
        });
    }
    else
    {
        $('#tblAssignment tr.assdetails').removeClass('hidden');
    }

* Работает как шарм. ** Для вас образные типы, assdetail == назначение детали.

Здесь, в зависимости от условия if, я либо скрываю строки, либо отключая валидатор, либо удаляя скрытый класс из строк.

0

Функция ValidatorEnable принимает объект как 1-й параметр, а не строку идентификатора объекта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню