2012-04-04 15 views
1

Ich habe ein paar Artikel gelesen über Checkboxen immer einen falschen Zustand, aber habe nichts über mein eigenes Problem gefunden.Checkbox immer wieder falsch

So, hier ist das Skript:

<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> 

Und hier ist der Code der 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 

Und hier wird der Code vom Server generiert:

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

In Am Anfang habe ich einen HTML-Helfer benutzt. Es wurde Rückkehr smth wie folgt aus:

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

ich, obwohl es aufgrund der zweiten Eingang war, dass es immer einen falschen Zustand zurückkehrt.

(sorry, wenn mein Englisch ist schlecht, ich bin kein Englisch als Muttersprache)

Antwort

1

Das Problem ist wahrscheinlich, dass this nicht was du denkst es ist. Versuchen Sie explizit einen Verweis auf die angeklickt Checkbox auf Ihre Funktion übergeben:

@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 

Und dann:

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) {} 
     }); 
    }; 

Alternativ jQuery verwenden, um die Click-Handler zuweisen und es wird this für Sie richtig eingestellt ist. Sie können die @item.idContact.toString() im value Attribute setzen und es dann zugreifen this.value in Ihrem Handler:

@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 

Und dann:

$(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) {} 
     }); 
    }); 
}); 

(Anmerkung: Ich weiß es nicht eigentlich die VB/Rasierer Syntax Ich denke nur an diesen Teil.)

+0

Es funktioniert sehr gut! Vielen Dank an alle. Dies ist die Lösung, die ich wähle, weil ich es verstehen konnte. –

+1

@EliasVanOotegem - Der '$ .ajax()' Teil hat nichts damit zu tun. In der ersten Hälfte meiner Antwort gebe ich 'this' vom Inline-Handler aus, so dass der 'cb'-Parameter das Kontrollkästchen ist. Die Alternative, die ich in der zweiten Hälfte meiner Antwort gegeben habe, verwendet jQuery, um den Click-Handler zu erstellen, so dass jQuery "this" auf das angeklickte Element setzt. – nnnnnn

+0

aw ... poppycock, sollte deine Antwort genauer betrachtet haben ... sorry –

1

Versuchen Sie, diese (Arbeits Geige hier: 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 ist korrekt: $ .ajax ist ein jQuery-Objekt, also $(this) wird nicht auf das Element verweisen, das die Funktion update_contact aufgerufen hat.Statt zwei Variablen zu schaffen (source ans a) als Mamoo der Fall ist, würde ich die var data kurz vor dem $.ajax Bit erstellen:

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

für $(this) zu arbeiten, anstatt Namen vorbei und ID-Parameter - was impliziert, dass Sie das Kontrollkästchen-Element irgendwo ausgewählt haben, und Sie rufen die Funktion in einer ähnlichen Weise wie folgt auf:

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

benutzen Sie einfach die kürzer, sauberer und leistungsstärker:

update_contact.call($(elem)); 

oder dem Inline- onclick="update_contact()"-onclick="update_contact.call(this)" ändern. nur das, ohne das $ -Zeichen oder die Klammern ...

+0

Das macht keinen Unterschied, weil es 'this' immer noch im Rahmen der 'update_contact()' Funktion verwendet. – nnnnnn

+0

Ich bin mir nicht sicher, ob es funktioniert, weil ich innerhalb meiner Warnung auch immer eine "falsche" Eigenschaft habe. –

+0

wird 'update_contact' nicht als Event-Handler verwendet? Ich nahm an, es war ... wenn nicht, ist nnnnn korrekt. Dies kann behoben werden, indem man diese Funktion explizit wie folgt aufruft: update_contact.call ($ ('# id')); 'oder indem man die Funktion natürlich bindet. @patxy: Wenn die Requisite immer falsch ist, ist die Funktion wahrscheinlich nicht an das Element gebunden, verwenden Sie die explizite Methode '.call' oder verwenden Sie die Methode' .bind ('event', callback) ' –