2010-03-31 4 views
36

У меня есть форма ASP.NET с тремя текстовыми вводами, по одному для «Рабочий телефон», «Домашний телефон» и «Сотовый телефон». Каждый из этих текстовых входов имеет связанный с ним связанный с ним RequiredFieldValidator. У меня также есть DropDownList, где пользователь может выбрать предпочтительный тип телефона.Динамически включить или отключить RequiredFieldValidator на основе значения DropDownList

Мне нужно только поле, выбранное в DropDownList. Например, если пользователь выбирает «Рабочий телефон» из DropDownList, я хочу отключить RequiredFieldValidator для «Домашний телефон» и «Сотовый телефон», поэтому требуется только поле «Рабочий телефон».

У меня есть метод, который включает и отключает эти валидаторы на основе значения DropDownList, но я не могу понять, когда его называть. Я хочу, чтобы этот метод выполнялся до проверки на странице. Как мне это сделать?

+0

Почему бы не использовать CustomValidator в этом случае? Отключение/включение RequiredFieldValidator может привести к проблеме дизайна в будущем - я буду придерживаться их использования в полях, которые понадобятся. –

+0

Спасибо за предложение. Я закончил использование CustomValidator. Раньше я их не использовал, но после того, как я его создал, это было намного мощнее. Я легко мог добавить другие проверки. – Jeremy

+0

@Jason M: Если вы сделаете предложение CustomValidator ответом, я его приму. – Jeremy

ответ

11

Почему бы не использовать CustomValidator в этом случае? Отключение/включение RequiredFieldValidator может привести к проблеме дизайна в будущем - я буду придерживаться их использования в полях, которые понадобятся.

+4

Я не согласен. В будущем я не вижу пути для разработки дизайна. Специально в простых ситуациях. –

+0

RequiredFieldValidator в большинстве случаев сохраняет простые вещи. – etlds

+0

CustomValidator не проверяет пустые поля –

0

OnChange в DropDownList, вам нужно будет зарегистрировать обработчик события на стороне сервера, который включает/выключает валидатор ...

HTH

+0

Вы говорите о событии OnSelectedIndexChanged в DropDownList? Я установил это событие для вызова метода, который включает/отключает валидаторы, но событие не срабатывает до завершения проверки. В этот момент уже слишком поздно. Мне нужно, чтобы он срабатывал до проверки. – Jeremy

+0

Нет, он означает клиентское событие «onchange» –

+0

Во-вторых, я бы сначала отобразил экран с выпадающим списком для выбора предпочтений. Затем, когда пользователь выбрал предпочтение, визуализируйте текстовое поле с соответствующим контролером проверки, а не сделайте все это на клиенте. – Sunny

39

Вы можете сделать это с помощью JavaScript, как это:

ValidatorEnable(RequiredFieldValidatorId, false); 

Тогда есть свой выпадающий список с помощью OnChange событие (я предложил бы использовать JQuery)

$("#<%=dropDownList.ClientID %>").change(function(){ 
    var val = $(this).val(); 
    var skip = null; 
    if (val == 1) 
     skip = "workPhoneValidator"; 
    else if (val == 2) 
     skip = "cellPhoneValidator"; 
    .... 

    // by popular demand... 
    var $skip = $("#" + skip)[0]; 

    if (skip != "workPhoneValidator") ValidatorEnable($skip, false); 
    if (skip != "cellPhoneValidator") ValidatorEnable($skip, false); 
    .... 
}); 
+0

Вы пробовали этот код? Похоже на приятное клиентское решение. Я как раз собирался опубликовать решение на стороне сервера, но похоже, что он переключает валидаторы на стороне клиента, не так ли? – citronas

+0

@citronas - да, это должно переключить клиентскую сторону валидаторов без обратной передачи – hunter

+0

Nice! +1 для этого !! –

2

OnChange событие падения вниз, вы можете иметь что-то вроде этого

function EnableValidator(){ 
    ValidatorEnable(requiredFieldValidator, validatorMustBeEnabled); 
} 

Проверка на этот адрес. Раздел "Клиент-Side API,"

http://msdn.microsoft.com/en-us/library/Aa479045#aspplusvalid_clientside

+0

убедитесь, что EnableClientScript является истинным – smoothumut

2

Возможный путь будет:

  • Набор в вашем DropDownList AutoPostBack="true"
  • В обработчике SelectedIndexChanged событий в DropDownList включить/отключить свои валидаторы
  • Установите в свой DropDownList CausesValidation="false", чтобы избежать блокировки обратной передачи при изменении записи DropDownList.
+1

causevalidation perfect! – Anicho

5

Когда вы используете домашний телефон, в выпадающем списке selectedindexchange, сделайте необходимые проверки валидатора невидимыми.

подобный ..

если выбран HomePhone,

homephonevalidator.visible=true 
cellphonevalidator.visible=false 
workphonevalidator.visible=false 

при выборе мобильного телефона,

homephonevalidator.visible=false 
cellphonevalidator.visible=true 
workphonevalidator.visible=false 

если выбран workphone,

homephonevalidator.visible=false 
cellphonevalidator.visible=false 
workphonevalidator.visible=true 
-1

Это хороший способ включения и выключения на стороне сервера проверка правильности от события jquery:

<label class="label_radio" for="Oversize" onclick="EnableDisbledValidator('show')">show textbox</label> 

<asp:TextBox ID="txtNote" runat="server" class="checkvalidation"></asp:TextBox> 

<asp:RequiredFieldValidator ID="rfvNote" runat="server" ControlToValidate="txtNote" SetFocusOnError="true" ErrorMessage="Please enter the note" Display="Dynamic" CssClass="error-tooltip"></asp:RequiredFieldValidator> 

function EnableDisbledValidator(lblShow) { 
    if (lblShow == "hide") {; 
     ValidatorEnable($('#<%=rfvNote.ClientID %>')[0], false); 

    } else { 
     ValidatorEnable($('#<%=rfvNote.ClientID %>')[0], true); 
    } 
} 
Смежные вопросы