2012-04-04 4 views
1

Я прочитал несколько статей, в которых упоминаются флажки, всегда возвращающие ложное состояние, но ничего не нашли о моей собственной проблеме.checkbox allways return false

Итак, вот сценарий:

<script type="text/javascript"> 
    function update_contact(id, name) { 
     alert("idCont : " + id + "\n nameCKB : " + name + "\n state : " 
       + $(this).attr('checked')); 
     var a = location.pathname.substring(1).split('/') 
     $.ajax({ 
      url : '@Url.Action("update_contact")', 
      type : 'POST', 
      data : { 
       name : name, 
       isChecked : $(this).is(':checked'), 
       idOpp : a[2], 
       idCont : id 
      }, 
      success : function(result) { 
      } 
     }); 
    }; 
</script> 

А вот код в CheckBox в:

@If mail = False Then 
    @<input type="checkbox" name="mailed" id="mailed" class="mailed" onclick="update_contact(@item.idContact.toString() , 'mailed')" /> 
Else 
    @<input type="checkbox" name="mailed" id="mailed" class="mailed" onclick="update_contact(@item.idContact.toString() , 'mailed')" checked="checked" /> 
End If 

А вот код, сгенерированный сервером:

<input name="mailed" id="mailed" class="mailed" onclick="update_contact(1 , 'mailed')" type="checkbox"> 

В В начале я использовал Html-помощник. Это возвращалось так:

<input id="mailed" name="mailed" onclick="update_contact(1 ,'mailed')" value="true" type="checkbox"> 
<input name="mailed" value="false" type="hidden"> 

Я, хотя это было из-за второго ввода, что он всегда возвращал ложное состояние.

(извините, если мой английский плохо, я не носитель английского языка)

ответ

1

Проблема заключается в том, что, вероятно, не this что вы думаете. Попробуйте явно передать ссылку на щелкнули флажок вашей функции:

@If mail = False Then 
     @<input type="checkbox" name="mailed" id="mailed" class="mailed" onclick="update_contact(@item.idContact.toString() , 'mailed', this)" /> 
Else 
     @<input type="checkbox" name="mailed" id="mailed" class="mailed" onclick="update_contact(@item.idContact.toString() , 'mailed', this)" checked="checked" /> 
End If 

А потом:

function update_contact(id, name, cb) { 
     alert("idCont: " + id + "\n nameCKB: " + name + "\n state: " + cb.checked); 
     // you could say $(cb).attr("checked"), but cb.checked is more efficient 
     // and easier to read 
     var a = location.pathname.substring(1).split('/') 
     $.ajax({ 
      url: '@Url.Action("update_contact")', 
      type: 'POST', 
      data: { 
        name: name, 
        isChecked: cb.checked, 
        idOpp: a[2], 
        idCont: id 
      }, 
      success: function (result) {} 
     }); 
    }; 

В качестве альтернативы использовать JQuery, чтобы назначить обработчик щелчка и он будет правильно установить this для вас. Вы можете поставить @item.idContact.toString() в атрибуте value, а затем получить доступ к нему с помощью this.value в обработчике:

@If mail = False Then 
     @<input type="checkbox" name="mailed" id="mailed" class="mailed" value="@item.idContact.toString()" /> 
Else 
     @<input type="checkbox" name="mailed" id="mailed" class="mailed" value="@item.idContact.toString()" checked="checked" /> 
End If 

А потом:

$(document).ready(function() { 
    $("#mailed").click(function() { 
     alert("idCont: " + this.value + "\n nameCKB: " + this.name + "\n state: " + this.checked); 
     // you could say $(this).attr("checked"), but this.checked is more efficient 
     // and easier to read 
     var a = location.pathname.substring(1).split('/') 
     $.ajax({ 
      url: '@Url.Action("update_contact")', 
      type: 'POST', 
      data: { 
        name: this.name, 
        isChecked: this.checked, 
        idOpp: a[2], 
        idCont: this.value 
      }, 
      success: function (result) {} 
     }); 
    }); 
}); 

(Примечание: Я на самом деле не знаю/синтаксис бритвы VB , Я просто догадываюсь об этой части.)

+0

Он работает очень хорошо! thx много всех. Это решение, которое я выбираю, потому что я смог его понять. –

+1

@EliasVanOotegem - часть '$ .ajax()' не имеет к этому никакого отношения. В первой половине моего ответа я передаю 'this' из встроенного обработчика, поэтому параметр' cb' будет отмечен. Альтернатива, которую я дал во второй половине моего ответа, использует jQuery для создания обработчика кликов, поэтому jQuery установит 'this' на элемент clicked. – nnnnnn

+0

aw ... poppycock, должен был внимательно посмотреть на ваш ответ ... извините –

1

Попробуйте (рабочий скрипку здесь: http://jsfiddle.net/Ac3kd/):

<script type="text/javascript"> 
    function update_contact(id, name) { 
     var source = $('#'+name); 
     alert("idCont : " + id + "\n nameCKB : " + name + "\n state : " + source.attr('checked')); 
     var a = location.pathname.substring(1).split('/') 
     $.ajax({ 
      url: '@Url.Action("update_contact")', 
      type: 'POST', 
      data: { 
        name: name, 
        isChecked: source.is(':checked'), 
        idOpp: a[2], 
        idCont: id 
      }, 
      success: function (result) {} 
     }); 
    }; 
</script> 
1

Mamoo is correct: $ .ajax - объект jQuery, поэтому $(this) не укажет на элемент, который вызвал функцию update_contact.Вместо создания двух переменных (source анс a), как mamoo делает, я бы создать var data как раз перед $.ajax бит:

function update_contact(id,name) 
{ 
    var data = {name: name, 
       isChecked: $(this).is(':checked'), 
       idOpp: location.pathname.substring(1).split('/')[2], 
       idCont: id}; 
    $.ajax({ 
      url: '@Url.Action("update_contact")', 
      type: 'POST', 
      data: data, 
      success: function (result) {} 
     }); 
} 

EDIT

для $(this) работать, вместо передачи имени и id, что означает, что вы выбрали элемент флажка где-то, и вы вызываете функцию аналогично этому:

update_contact($(elem).attr('id'),$(elem).attr('name')); 

просто использовать более короткий, чище и мощнее:

update_contact.call($(elem)); 

Или изменить встроенный onclick="update_contact()" к onclick="update_contact.call(this)". просто это, без знака $ или скобки ...

+0

Это не будет иметь никакого значения, потому что оно все еще использует 'this' в области функции' update_contact() '. – nnnnnn

+0

Я не уверен, что это сработает, потому что внутри моего предупреждения у меня также всегда есть свойство «false». –

+0

не является 'update_contact', используемым в качестве обработчика событий? Я предположил, что это было ... если нет, nnnnn правильно. это может быть исправлено путем явного вызова этой функции, например, так: 'update_contact.call ($ ('# id'));' или связыванием функции, конечно. @patxy: если prop всегда false, функция, вероятно, не привязана к элементу, использует явный метод '.call' или использует подход' .bind ('event', callback) ' –