【问题标题】:Passing variables to javascript in onclientclick在onclientclick中将变量传递给javascript
【发布时间】:2012-10-11 23:51:01
【问题描述】:

好的,我想我已经从 stackoverflow 尝试了 3-4 种方法,但似乎都没有。

我有:

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)) %>'

但是给了我完全相同的问题.... 所以我很迷茫?

【问题讨论】:

  • 这个属于什么控件(&lt;asp:NavigateURL&gt;&lt;asp:Button&gt;&lt;asp:LinkButton&gt;等)?
  • 在您的第一个示例中,如果您将其更改为在 doConfirm 方法调用中使用单引号会发生什么? OnClientClick='&lt;%# Eval("albumName", "doConfirm('delete', '{0}');").ToString() %&gt;'

标签: c# javascript asp.net onclientclick


【解决方案1】:

对于这么长的回答,我提前道歉,但我想彻底。

这显然是 .Net 4.0(及更高版本)中的“安全”功能。你可以阅读更多关于它的信息:

以上所有链接还建议声明一个公共类来覆盖该行为:

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

然后将其添加到 web.config 中的 &lt;system.web&gt; 元素:

<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

因此,虽然它在源代码中看起来很时髦,但将引号和撇号呈现为 &amp;quot;&amp;#39; 似乎并没有真正影响任何事情。

【讨论】:

    【解决方案2】:

    尝试以下方法:

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

    JS:

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

    【讨论】:

    • 这将使按钮文本动态..我不想要那个
    【解决方案3】:

    只需将事件服务器端附加到rowDataBound 事件中,例如,(您可以将链接按钮替换为按钮)

    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") + " ?');");
    }
    

    【讨论】:

      【解决方案4】:

      即使这个问题已经 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);
      }
      

      这解决了这个问题,因为文本属于隐藏字段,而不是尝试将其包含在 OnClientClick 属性的 JavaScript 中。

      顺便说一句:我无法复制和粘贴,因此此代码可能包含一些拼写错误,但我相信它是正确的。至少它指明了方向,以便您可以解决该问题。

      【讨论】:

      • 在上面的 Page_Load 中,替换 "MsgBox({0}.value..." wil alert({0}.value)。MsgBox 是我们编写的一个 JavaScript 函数,用于显示一个警报对话框一些其他选项和格式。我添加了这个评论,因为我可以看到这可能会增加一些混乱。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      相关资源
      最近更新 更多