2010-05-17 7 views
8

Ich gebe den Firmennamen an ein onclick-Ereignis weiter. Einige Firmennamen haben Apostrophe in ihnen. Ich habe ".Replace (" '"," ' ") zum Feld company_name hinzugefügt. Dadurch kann das Onclick-Ereignis ausgelöst werden, die Bestätigungsmeldung wird jedoch als "Jane & # 39; s Welding Company" angezeigt.Escape-Apostroph beim Übergeben von Parametern im onclick-Ereignis

<a href="#" onclick="return Actionclick('<%= Url.Action("Activate", new {id = item.company_id}) %>', '<%= Html.Encode(item.company1.company_name.Replace("'", "&#39;")) %>');" class="fg-button fg-button-icon-solo ui-state-default ui-corner-all"><span class="ui-icon ui-icon-refresh"></span></a> 

<script type="text/javascript"> 
function Actionclick(url, companyName) 
{ 
    if (confirm('This action will activate this company\'s primary company ('+companyName+') and all of its other subsidiaries. Continue?')) 
    { 
     location.href = url; 
    }; 
}; 

EDIT Die Bestätigungsnachricht zeigt die & # 39; in der Nachricht und nicht in der '. Als ich es hier tippte, ersetzte es die & # 39; mit einem '. Leerzeichen hinzugefügt, damit das nicht passieren würde. Ich möchte wissen, wie ich es am besten an mein onclick-Ereignis weiterleiten und es auch in der Nachricht anzeigen kann, ohne mehrere Ersetzungen vorzunehmen (wenn es einen besseren Weg gibt).

+0

Vielleicht bin ich albern, aber was ist die spezifische Frage hier? Willst du das nicht in der Bestätigungsnachricht oder willst du? – griegs

+0

Whoops. Siehe Bearbeiten. – RememberME

Antwort

12

Es gibt zwei Möglichkeiten, wie ich es sehe.

  1. Wenn Sie die Parameter in Anführungszeichen wickeln (") anstelle von Apostrophe/Apostrophe ('), dann sollten Sie es überhaupt nicht entkommen müssen. HTML-Codierung werden alle Zitate der Codierung kümmern (wenn sie in der Kette ist) und der Apostroph ist kein Problem sein, obwohl, wie die JavaScript bereits in Anführungszeichen eingewickelt wird, müssen Sie Ihre Angebote Backslash zB:..

    onclick="return Actionclick(\"<%= Url.Action("Activate", new {id = item.company_id}) %>\", \"<%= Html.Encode(item.company1.company_name) %>\");"

  2. Aufkantung entkommen die Firmenname, da es nur die letzte Javascript-Zeichenkette ist, die den Apostroph maskiert, nicht den HTML-Code benötigt, zB:

    onclick="return Actionclick('<%= Url.Action("Activate", new {id = item.company_id}) %>', '<%= Html.Encode(item.company1.company_name.Replace("'", "\\'")) %>');"

+0

Ich habe die Flucht des Backslash selbst in # 2 vermisst. Bearbeitet. –

+0

Vielen Dank !!! Hat mir gerade bei meinem Problem geholfen !!! – Jenski

2

Sie einen JavaScript-String-Literal in einem HTML-Attribut-Wert haben.

So müssen Sie zuerst JS-kodieren den Wert (die ' mit \' und \ mit \\ ersetzt), dann HTML-kodieren. Derzeit sind Sie HTML-Codierung der ' (was wäre ineffizient, da der Browser es zurück zu einem Apostroph entschlüsseln würde, bevor die JS-Engine es sah) ... und dann HTML-Codierung es wieder, so dass es wörtlich bedeutet &#39;.

Verwenden Sie einen JSON-Encoder, um eine Zeichenfolge (oder einen anderen Werttyp) in ein JavaScript-Literal umzuwandeln.

Jedoch. JavaScript in einer Zeichenkette zu schreiben ist total nervig. Es ist nicht etwas, wozu der Verstand gut ist. Also tu es nicht. Vermeiden Sie jederzeit Inline-Event-Handler-Attribute. Verwenden Sie stattdessen static script und weisen Sie Handler aus JavaScript selbst zu, indem Sie unaufdringliches Scripting verwenden.

<a class="dangerous fg-button fg-button-icon-solo ui-state-default ui-corner-all" 
    href="<%= Server.HTMLEncode(Url.Action("Activate", new {id = item.company_id})) %>" 
    title="This action will activate this company's primary company (<%= Server.HTMLEncode(companyName) %>) and all of its other subsidiaries." 
> 
    <span class="ui-icon ui-icon-refresh"></span> 
</a> 

(Ich werde jQuery verwenden, da Sie es in Ihrem Tags haben :)

<script type="text/javascript"> 
    $('.dangerous').click(function() { 
     return confirm(this.title+' Continue?'); 
    }); 
</script> 

weisen jedoch darauf hin, dass dies ein Missbrauch von <a>. Aktionen, die eine aktive Änderung an etwas vornehmen, sollten niemals als GET-Anfrage gesendet oder zugelassen werden. Sie sollten stattdessen eine Schaltfläche verwenden, die eine POST-Anfrage sendet (entweder direkt als Formular oder über AJAX). (Sie sollten auch über ASP nachdenken.NETs eingebaute Kontrollen anstelle der Templating die Werte in, um zu vermeiden, HTMLEncode ziemlich viel zu rufen.)

Sehen Sie this classic WTF für eine Weise, in der dieses Sie beißen kann.

1

Ich bin gerade erst 5 Jahre später begegnet, also teile ich mit, was bei mir funktioniert hat.

Check out HttpUtility.JavaScriptStringEncode auf MSDN

können Sie diese verwenden, um die Zeichenfolge auf der Serverseite zu codieren, wenn der Wert der Eigenschaft festlegen. Dies erzeugt die Unicode-Darstellung des Apostrophs - "\ u0027", die an den JavaScript-onclick übergeben werden kann.

Für die Original-Beispiel:

item.company1.company_name = HttpUtility.JavaScriptStringEncode("Jane's Welding Company"); 

auf HttpUtility.JavaScriptStringEncode

"Jane'\u0027s Welding Company" 

Eine Note - Sie können wählen, eine boolean geben Sie die Zeichenfolge mit doppelten Anführungszeichen (bool addDoubleQuotes zu kodieren). Da diese Zeichenfolge jedoch als Parameter für eine JavaScript-Funktion verwendet wird, möchten Sie die zusätzlichen Anführungszeichen nicht verwenden.

Verwandte Themen