2010-05-17 65 views
8

我將公司名稱傳遞給onclick事件。一些公司名稱中有撇號。我將''替換(「'」,「'」)'到company_name字段。這允許觸發onclick事件,但確認消息顯示爲「Jane &#s焊接公司」。在onclick事件中傳遞參數時忽略撇號

<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 該確認消息表示&#39;在消息而不是'。當我在這裏輸入時,它取代了這個名字。與'。增加空間,這樣就不會發生。我想知道將它傳遞給我的onclick事件的最佳方式,並且在不做多次替換(如果有更好的方法)的情況下正確顯示它在消息中。

+0

也許我很愚蠢,但是這裏的具體問題是什麼?你不想要'在確認信息中或你想要'嗎? – griegs 2010-05-17 00:19:55

+0

哎呀。請參閱編輯。 – RememberME 2010-05-17 00:25:37

回答

12

有兩個選項,我看到它。

  1. 如果你用引號括(「)的參數,而不是撇號/單引號('),那麼你不應該需要逃避它。HTML編碼將編碼任何引號的護理(如果他們在字符串中)和撇號的將不會是一個問題。雖然,因爲JavaScript是已經包裹在引號,你將需要反斜槓轉義您的報價如:。

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

  2. 反斜槓逃脫公司名稱,因爲它只是需要撇號轉義的最終javascript字符串,而不是HTML。例如:

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

+0

我錯過了#2中反斜槓本身的轉義。編輯。 – 2010-05-17 00:33:54

+0

非常感謝!剛剛幫我解決了我的問題! – Jenski 2010-06-29 08:36:53

2

你已經有了一個JavaScript字符串的HTML屬性值內的文字。

所以,你會需要首先JS編碼值(替代'\'\\\),然後HTML編碼。目前,您使用的是HTML編碼'(這將是無效的,因爲瀏覽器會在JS引擎看到它之前將其解碼爲撇號),然後再對其進行HTML編碼,使其字面意思爲&#39;

使用JSON編碼器將字符串(或任何其他值類型)轉換爲JavaScript文字。

但是,在一個字符串中編寫JavaScript非常糟糕。跟蹤多層逃跑並不是頭腦所擅長的。所以不要這樣做。始終避免內聯事件處理程序屬性。相反,使用靜態腳本並使用不引人注意的腳本從JavaScript本身分配處理程序。

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

(我會使用jQuery因爲你必須在你的標籤:)

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

但是請注意,這是<a>的濫用。作爲主動修改某些內容的操作不應該作爲GET請求發送或允許接收。您應該使用提交POST請求的按鈕(直接作爲表單或通過AJAX)。 (你也應該考慮使用ASP。NET的內置控件,而不是模板化值,以避免必須致電HTMLEncode。)

請參閱this classic WTF這是一種可以咬你的方法。

1

我剛剛在5年後遇到了這樣的情況,所以我會分享一下對我有用的東西。

檢查MSDN

HttpUtility.JavaScriptStringEncode

您可以使用此設置屬性的值時,該字符串編碼在服務器端。這將產生撇號的unicode表示 - 「\ u0027」可以傳遞給JavaScript onclick。

對於原來的例子:

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

將成爲

"Jane'\u0027s Welding Company" 

了一份關於HttpUtility.JavaScriptStringEncode - 您可以選擇指定一個布爾值與雙引號的字符串編碼(布爾addDoubleQuotes )。但是,由於該字符串將用作JavaScript函數的參數,因此您不需要額外的引號。