Подтвердить что ты не робот

Как передать несколько параметров Eval()?

У меня есть код aspx, который использует Eval для генерации вызова функции javascript:

ASP.NET(для удобства чтения):

<asp:LinkButton runat="server"
   OnClientClick='<%# Eval(
         "NodeGUID", 
         "return DoStuff(this, \"{0}\");") %>'
   Text="Do stuff" />

это генерирует javascript, похожий на:

Javascript (завернутый для чтения):

return DoStuff(this,
      "3F2504E0-4F89-11D3-9A0C-0305E82C3301"
   );

Примечание. Я преобразовал сгенерированные ссылки " в кавычки для удобства чтения.

Теперь мне нужно добавить 3-й параметр в вызов функции javascript, подпись:

Javascript (завернутый для удобочитаемости)

return DoStuff(this,
      "3F2504E0-4F89-11D3-9A0C-0305E82C3301",
      "AllisonAngel.jpg"
   );

Примечание. Я преобразовал сгенерированные ссылки " в кавычки для удобства чтения.


В файле кода уже существует функция, которая используется для возврата заголовка элемента:

С# (код опущен для удобочитаемости):

protected string GetItemText(MySomething item)
{
   ...
}

Я знаю, что указанную выше функцию можно вызывать из файла aspx, используя синтаксис, подобный:

ASP.NET(завернутый, код опущен, для чтения):

<asp:LinkButton ... runat="server"
   Text="<%# GetItemText((MySomething)Container.DataItem) %>" 
   ... />

Итак, теперь я хочу использовать эту функцию для включения третьего параметра в функцию javascript.

Начиная с:

<asp:LinkButton runat="server"
   OnClientClick='<%# Eval(
         "NodeGUID",
         "return DoStuff(this, \"{0}\", \"Todo - Insert caption here\");") %>'
   Text="Do stuff" />

Мне нужно изменить: "Todo - Insert caption here"

в вызов: <%# GetItemText((MySomething)Container.DataItem) %>

Слепо попробуйте очевидное:

ASP.NET(для удобства чтения):

<asp:LinkButton runat="server"
   OnClientClick='<%# Eval(
         "NodeGUID", 
         GetItemText((MySomething)Container.DataItem),
         "return DoStuff(this, \"{0}\", \"{1}\");") %>'
   Text="Do stuff" />

Но это жалуется, поскольку Eval() принимает только два параметра.


Я попробовал немного менее поучительный:

ASP.NET(завернутый для удобства чтения)

<asp:LinkButton runat="server"
   OnClientClick='<%# Eval(
         "NodeGUID", 
         "return DoStuff(this, 
               \"{0}\", 
               \""+GetItemText((MySomething)Container.DataItem)+"\");") %>'
   Text="Do stuff" />

Но это тоже не работает.


Вопросы, относящиеся

ASP.NET: как получить доступ к регенерированным элементам из javascript?

asp.NET: Как получить сгенерированные элементы репитера?

4b9b3361

Ответ 1

Хитрость заключается не в том, чтобы передать несколько элементов в eval, а для того, чтобы передать несколько eval на все, что вы хотите использовать для форматирования данных. Вы могли бы просто сделать это так, чтобы сохранить презентацию в aspx файле, как вы хотели...

<asp:LinkButton 
   runat="server" 
   OnClientClick='<%# string.Format(
          "return DoStuff(this, \"{0}\", \"{1}\");", 
          Eval("NodeGUID"), 
          GetItemText((MySomething)Container.DataItem)) %>' 
   Text="Do stuff" />

Ответ 2

Мой трюк

Eval ( "FLName", Eval ( "FLFDID", "{0}" ) + "/{0}" )

Эваль внутри Eval

Это работает для меня!

Ответ 3

Robert C. Barth дал мне идею, которая решает проблему:

<asp:LinkButton runat="server"
      OnClientClick="<%# GetItemClientClick((MySomething)Container.DataItem) %>" 
      Text="Do stuff" />

а затем файл с кодом:

protected string GetItemClientClick(MySomething item)
{
   ...

   String szOnClientClick =
      "return DeleteItem(this, "+
            Toolkit.QuotedStr(item.NodeGUID.ToString()) + ", "+
            Toolkit.QuotedStr(GetItemText(item))+");";

   return szOnClientClick;
}

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

Ответ 4

Если LinkButton не находится внутри какой-либо другой вещи (например, сетки), просто установите атрибут OnClientClick в коде, как обычно, используя string.Format.

Если он находится в сетке (или ретрансляторе или что-то в этом роде), установите его в событии RowDataBound с помощью FindControl или e.Row.Cells [] и string.Format. Если вы используете e.Row.Cells [], возможно, вы можете сбросить серверный элемент управления LinkButton и просто вывести нормальный тег привязки.

Ответ 6

Продолжая решение Скотта Айви, вы также можете использовать это, чтобы включить в операторы Eval следующие утверждения:

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

<%# string.Format(Eval("Url") != null ? "<a href=\"{0}\">{1}</a>" : "<span>{1}</span>", Eval("Url"), Eval("Text")) %>">