2012-10-11 46 views
3

好吧,我想我已經嘗試3-4從這裏從stackoverflow方法,但似乎沒有工作。將變量傳遞給javascript在onclientclick

我有:

OnClientClick='<%# Eval("albumName", "doConfirm(\"delete\", \"{0}\");").ToString() %>' 

但在HTML它呈現爲:

onclick="doConfirm(&quot;delete&quot;, &quot;Test&quot;);" 

還試圖使一個方法調用:

public string CreateConfirmation(String action, String item) { 
    return String.Format(@"return confirm('Sikker på du vil {0}: {1}');", action, item); 
} 

有了這個:

OnClientClick='<%# CreateConfirmation("delete", (string)Eval(albumName)) %>' 

但給我完全一樣的問題.... 所以我很迷路?

+0

這屬於什麼類型的控件('','',''等等)? – pete

+0

在第一個示例中,如果將其更改爲在doConfirm方法調用中使用單引號,會發生什麼情況? 'OnClientClick ='<%#Eval(「albumName」,「doConfirm('delete','{0}');」)。ToString()%>'' –

+0

它的一個按鈕控制... –

回答

7

我提前爲這樣一個長的答案道歉,但我想徹底。

這顯然是.Net 4.0(及更高版本)中的「安全」功能。你可以閱讀更多關於它:

上述所有環節的推薦聲明一個公共類重寫的行爲:

public class HtmlAttributeNoEncoding : System.Web.Util.HttpEncoder 
{ 
    protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output) 
    { 
     output.Write(value); 
    } 
} 

然後將其添加到<system.web>元素在你的web.config:

<httpRuntime encoderType="HtmlAttributeNoEncoding"/> 

這絕對修復的呈現問題,讓引號和撇號呈現爲"'(如預期)。

這麼說,我測試了你的問題如下:

<script type="text/javascript"> 
    var doConfirm = function (action, item) { 
     alert('Sikker på du vil ' + action + ': ' + item); 
     return false; 
    }; 
</script> 

<p>Some "arbitrary" text. <asp:Button ID="Button3" runat="server" Text="Button" OnClientClick="doConfirm('delete', 'myalbum');" /></p> 
<asp:GridView ID="GridView1" runat="server"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick='<%# Eval("albumName", "doConfirm(\"delete\", \"{0}\");").ToString() %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField HeaderText="Album Name" DataField="albumName" /> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Button ID="Button2" runat="server" Text="Button" OnClientClick='<%# CreateConfirmation("delete", (string)Eval("albumName")) %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

,並在後臺代碼:

public partial class _Default : System.Web.UI.Page 
{ 
    public string CreateConfirmation(String action, String item) 
    { 
     return String.Format(@"return doConfirm('{0}', '{1}');", action, item); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     DataTable dt = new DataTable(); 
     DataColumn dc = new DataColumn("albumName", typeof(string)); 
     DataRow dr = null; 

     dt.Columns.Add(dc); 

     dr = dt.NewRow(); 
     dr["albumName"] = "Zen Arcade"; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["albumName"] = "New Day Rising"; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["albumName"] = "Candy Apple Grey"; 
     dt.Rows.Add(dr); 

     GridView1.DataSource = dt; 
     GridView1.DataBind(); 
    } 

} 

我能複製你的渲染問題:

<p>Some "arbitrary" text. 
    <input type="submit" onclick="doConfirm(&#39;delete&#39;, &#39;myalbum&#39;);" value="Button" name="ctl00$MainContent$Button3" id="MainContent_Button3" /> 
</p> 
<div> 
    <table cellspacing="0" rules="all" border="1" id="MainContent_GridView1" 
    style="border-collapse:collapse;"> 
     <tr> 
      <th scope="col">&nbsp;</th> 
      <th scope="col">Album Name</th> 
      <th scope="col">&nbsp;</th> 
      <th scope="col">albumName</th> 
     </tr> 
     <tr> 
      <td> 
       <input type="submit" onclick="doConfirm(&quot;delete&quot;, &quot;Zen Arcade&quot;);" value="Button" name="ctl00$MainContent$GridView1$ctl02$Button1" id="MainContent_GridView1_Button1_0" /> 
      </td> 
      <td>Zen Arcade</td> 
      <td> 
       <input type="submit" onclick="return doConfirm(&#39;delete&#39;, &#39;Zen Arcade&#39;);" value="Button" name="ctl00$MainContent$GridView1$ctl02$Button2" id="MainContent_GridView1_Button2_0" /> 
      </td> 
      <td>Zen Arcade</td> 
     </tr> 
     <tr> 
      <td> 
       <input type="submit" onclick="doConfirm(&quot;delete&quot;, &quot;New Day Rising&quot;);" value="Button" name="ctl00$MainContent$GridView1$ctl03$Button1" id="MainContent_GridView1_Button1_1" /> 
      </td> 
      <td>New Day Rising</td> 
      <td> 
       <input type="submit" onclick="return doConfirm(&#39;delete&#39;, &#39;New Day Rising&#39;);" value="Button" name="ctl00$MainContent$GridView1$ctl03$Button2" id="MainContent_GridView1_Button2_1" /> 
      </td> 
      <td>New Day Rising</td> 
     </tr> 
     <tr> 
      <td> 
       <input type="submit" onclick="doConfirm(&quot;delete&quot;, &quot;Candy Apple Grey&quot;);" value="Button" name="ctl00$MainContent$GridView1$ctl04$Button1" id="MainContent_GridView1_Button1_2" /> 
      </td> 
      <td>Candy Apple Grey</td> 
      <td> 
       <input type="submit" onclick="return doConfirm(&#39;delete&#39;, &#39;Candy Apple Grey&#39;);" value="Button" name="ctl00$MainContent$GridView1$ctl04$Button2" id="MainContent_GridView1_Button2_2" /> 
      </td> 
      <td>Candy Apple Grey</td> 
     </tr> 
    </table> 
</div> 

當任何按鈕被點擊時,JavaScript函數忽略HTML編碼,提醒我:

Sikker på du vil delete: Zen Arcade 

因此,儘管它看起來在源質樸,有引號和撇號呈現爲&quot;&#39;並沒有真正出現什麼影響。

4

嘗試以下操作:

<asp:Button OnClientClick="Delete(this);" Text='<%# Eval("albumName"); %>' /> 

JS:

function Delete(element) { 
    var value = element.value; 
    return confirm('Delete' + value + '?'); 
} 
+0

這將使按鈕文字動態..我不想那 –

1

剛裝上時服務器端內部rowDataBound事件一樣,(你可以替換按鈕的LinkBut​​ton)

LinkButton myLinkButton=(LinkButton)e.row.FindControl("yourButtonName"); 
if(myLinkButton!=null) 
{ 
    myLinkButton.Attributes.Add("onclick","javascript:return confirm ('Are you sure you want to delete "+ DataBinder.Eval(e.row.DataItem, "YourDbField") + " ?');"); 
} 
0

即使這個問題是5歲,我想跟進,因爲我有一個ImageButton相同的問題,並能夠使用HiddenField解決它。

背景:我有一個Web用戶控件,如果有可用的幫助,我想要顯示幫助按鈕。

我向用戶控件添加了一個HiddenField和一個ImageButton。然後,我在控件上創建了一個屬性,以便開發人員可以添加幫助文本。

ASPX頁面

<asp:HiddenField ID="hidHelpText" runat="server" /> 
<asp:ImageButton ID="imgHelp" runat="server" ImageUrl="~/images/help.png" Visible="False" /> 

代碼隱藏(CS文件)

public string HelpText 
{ 
    get { return hidHelpText.Value; } 
    set { hidHelpText.Value = value; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    imgHelp.Visible = !string.IsNullOrEmpty(HelpText); 
    imgHelp.OnClientClick = string.Format("MsgBox({0}.value, MessageButtons.OK); return false;", hidHelpText.ClientID); 
} 

這得到解決此問題的文本屬於隱藏字段,而不是試圖對JavaScript的範圍內包括它OnClientClick屬性。

順便說一句:我不能複製和粘貼,所以這段代碼可能包含一些拼寫錯誤,但我相信它是正確的。至少它指出了方向,所以你可能能夠解決這個問題。

+0

在上面的Page_Load中,替換「MsgBox({0} .value ...」wil alert({0} .value)。MsgBox是我們編寫的一個JavaScript函數,用於呈現警報對話框以及其他一些選項和格式。我添加了這個評論,因爲我可以看到這可能會增加一些混淆。 –