Asp.Net и Shadowbox - PullRequest
       10

Asp.Net и Shadowbox

1 голос
/ 21 сентября 2009

Попытка вызвать Shadowbox IFrame с помощью Jquery из asp: gridview datarow. Я не могу получить правильные кавычки в строку:

<asp:ImageButton ID="btnEdit" runat="server"
    OnClientClick='<%# "javascript:popAccount(\'"+ 
    Eval("id", "Popup.aspx?id={0}")+"\');" %>' />

Сообщение об ошибке анализатора: тег сервера сформирован неправильно.

Без экранированных одинарных кавычек (не может работать, но правильно анализирует):

<asp:ImageButton ID="btnEdit" runat="server"
    OnClientClick='<%# "javascript:popAccount("+ 
    Eval("id", "Popup.aspx?id={0}")+");" %>' />

HTML на стороне клиента, как и ожидалось:

onclick="javascript:popAccount(Popup.aspx?id=3ce3b19c-1899-4e1c-b3ce-55e5c02f1);"

Как мне получить кавычки в Javascript?

Редактировать: добавлено решение. Это не очень универсально, так как типы данных должны быть известны для доступа к свойству id. Ключ (как определено в параметре GrodView DataKeyNames), по-видимому, не отображается в аргументе события. Но это работает.

    protected void editGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        // do not look at header or footer
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            ImageButton btn = e.Row.FindControl("btnPopup") as ImageButton;
            if (btn != null)
            {
                btn.OnClientClick = 
                "javascript:popAccount('EditAccountPopup.aspx?"+
                Constants.acctidParam+"="+
                ((tb_account)(e.Row.DataItem)).id.ToString()+"');";
            }
        }

Ответы [ 2 ]

1 голос
/ 21 сентября 2009

Подберите ImageButton в событии привязки строки GridView в codebehind и добавьте свойство оттуда.

Но вы уверены, что вам нужно использовать серверный элемент управления? Как насчет простого изображения? Если вы «заменяете» поведение нажатия кнопки ImageButton, это не похоже на то, что вам это вообще нужно.

Обновление:

Для решения с выделением кода я кодировал этот небольшой пример (в VB.NET, извините):

  Private Sub gridview1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gridview1.RowDataBound
    Select Case e.Row.RowType
      Case DataControlRowType.DataRow
        Dim btnEdit As ImageButton = CType(e.Row.Cells(0).FindControl("btnEdit"), ImageButton)
        Dim strID As String = CType(e.Row.DataItem, Guid).ToString

        btnEdit.Attributes.Add("onclick", String.Format("javascript:popAccount('Popup.aspx?id={0}');", strID))
    End Select
  End Sub

Тем не менее, я все же рекомендую вам пойти по более простому подходу, jQuery здесь превосходен. нет нужен любой код в вашем коде:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title></title>

  <script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js" type="text/javascript"></script>

  <script type="text/javascript" language="javascript">
    $(document).ready(function() {

      $("img.edit").click(function() {
        var sID = this.id.replace('btnEdit_', '');
        alert(sID); // Add your popup opening logic here...
      });
    });
  </script>

</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:GridView ID="gridview2" AutoGenerateColumns="false" runat="server">
      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <img id="btnEdit_<%#Container.DataItem %>" class="edit" />
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
    </asp:GridView>
  </div>
  </form>
</body>
</html>
0 голосов
/ 21 сентября 2009

Если вы хотите сохранить свой код таким, какой он есть, почему бы просто не сделать это?

<asp:ImageButton ID="btnEdit" runat="server"
    OnClientClick='<%# "javascript:popAccount(&quot"+ 
    Eval("id", "Popup.aspx?id={0}")+"&quot);" %>' />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...