Передача переменных в JavaScript в onclientclick

Хорошо, я думаю, что яя пробовал 3-4 метода здесь из stackoverflow, но, похоже, ни один не работает.

у нас есть:

OnClientClick=''

но в HTML это выглядит как:

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

Также попытался сделать метод для вызова:

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

С этим:

OnClientClick=''

Но дает мне точно такую же проблему .... Так я довольно потерян?

 pete12 окт. 2012 г., 01:56
К какому типу контроля это относится (,,, так далее.)?
 Adam Plocher12 окт. 2012 г., 02:01
В вашем первом примере, что произойдет, если вы измените его на использование одинарных кавычек при вызове метода doConfirm?OnClientClick=''
 Christian Bekker12 окт. 2012 г., 09:29
Это кнопка управления ...

Ответы на вопрос(4)

Решение Вопроса

но я хотел быть тщательным.

Это видимобезопасность" функция в .Net 4.0 (и выше). Вы можете прочитать больше об этом на:

http://avinashsing.sunkur.com/2010/10/29/asp-net-html-encoding-attributes-in-server-controls/http://forums.asp.net/p/1554455/3818604.aspxОстановить построитель тегов, избегая одинарных кавычек ASP.NET MVC 2

Все вышеперечисленные ссылки также рекомендуют объявить открытый класс для переопределения поведения:

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

а затем добавив это к элемент в вашем web.config:

<httpruntime encodertype="HtmlAttributeNoEncoding">
</httpruntime>

Это определенно решает проблему рендеринга, поэтому кавычки и апострофы отображаются как" а также' (как и ожидалось).

Тем не менее, я проверил вашу проблему со следующим:

<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');"></asp:button></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() %>">
            </asp:button></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")) %>">
            </asp:button></itemtemplate>
        </asp:templatefield>
    </asp:boundfield></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('delete', 'myalbum');" 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;">
        <tbody><tr>
            <th scope="col"> </th>
            <th scope="col">Album Name</th>
            <th scope="col"> </th>
            <th scope="col">albumName</th>
        </tr>
        <tr>
            <td>
                <input type="submit" onclick="doConfirm("delete", "Zen Arcade");" 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('delete', 'Zen Arcade');" 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("delete", "New Day Rising");" 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('delete', 'New Day Rising');" 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("delete", "Candy Apple Grey");" 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('delete', 'Candy Apple Grey');" value="Button" name="ctl00$MainContent$GridView1$ctl04$Button2" id="MainContent_GridView1_Button2_2">
            </td>
            <td>Candy Apple Grey</td>
        </tr>
    </tbody></table>
</div>

При нажатии любой из кнопок функция JavaScript игнорировала кодировку HTML, предупреждая меня о следующем:

Sikker på du vil delete: Zen Arcade

поэтому, хотя в источнике это выглядит странно, цитаты и апострофы отображаются как" а также' Безразлично»на самом деле, кажется, что-то влияет.

Просто прикрепите сторону сервера событий внутри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") + " ?');");
}

я хотел продолжить, поскольку у меня была та же проблема с ImageButton, и я смог решить ее с помощью HiddenField.

Справочная информация: у меня есть пользовательский веб-элемент управления, который я хотел, чтобы кнопка справки отображалась, если была доступна справка.

Я добавил HiddenField и ImageButton в пользовательский элемент управления. Затем я создал свойство элемента управления, чтобы разработчик мог добавить текст справки.

ASPX Page

<asp:hiddenfield id="hidHelpText" runat="server">
<asp:imagebutton id="imgHelp" runat="server" imageurl="~/images/help.png" visible="False">
</asp:imagebutton></asp:hiddenfield>

Код позади (файл 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.

Кстати, я не могу скопировать и вставить, поэтому этот код может содержать некоторые опечатки, но я считаю, что это правильно. По крайней мере, это указывает путь, чтобы вы могли обойти проблему.

 Richard Teel30 янв. 2018 г., 18:21
В приведенном выше Page_Load заменить "MsgBox ({0} .value ...» будет оповещено ({0} .value). MsgBox - это функция JavaScript, которую мы написали, чтобы представить диалоговое окно с некоторыми другими параметрами и форматированием. Я добавил этот комментарий, так как вижу, как это может добавить некоторую путаницу.

<asp:button onclientclick="Delete(this);" text="<%# Eval("albumName"); %>">
</asp:button>

JS:

function Delete(element) {
    var value = element.value;
    return confirm('Delete' + value + '?');
}
 Christian Bekker12 окт. 2012 г., 09:31
Это сделает текст кнопки динамическим. Я не хочу этого

Ваш ответ на вопрос