Передача нескольких аргументов через CommandArgument кнопки в Asp.net - PullRequest
24 голосов
/ 05 марта 2010

У меня есть сетка с несколькими строками, у каждой есть кнопка Обновить, и мне нужно передать 2 значения, когда кто-то нажимает на кнопку Обновить. Помимо упаковки аргументов внутри CommandArgument, разделенных запятыми (архаичные и не элегантные), как мне передать более одного аргумента?

<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>

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

Ответы [ 7 ]

74 голосов
/ 01 июля 2011

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

<asp:TemplateField ShowHeader="false">
    <ItemTemplate>
       <asp:LinkButton ID="lnkCustomize" Text="Customize"  CommandName="Customize"  CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>'  runat="server"> 
       </asp:LinkButton>   
    </ItemTemplate>   
</asp:TemplateField>

на стороне сервера

protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
      string[] arg = new string[2];
      arg = e.CommandArgument.ToString().Split(';');
      Session["IdTemplate"] = arg[0];
      Session["IdEntity"] = arg[1];
      Response.Redirect("Samplepage.aspx");
}

Надеюсь, это поможет !!!!

15 голосов
/ 05 марта 2010

После осмотра кажется, что Келси верна.

Просто используйте запятую или что-то еще и разделяйте их, когда хотите их использовать.

13 голосов
/ 24 июля 2015

@ Ответ Патрика - хорошая идея, и она заслуживает большего! Вы можете иметь столько элементов данных, сколько хотите, все они разделены и могут использоваться на стороне клиента, если это необходимо.

Их также можно добавлять декларативно, а не в коде. Я просто сделал это для GridView, как это:

<asp:TemplateField HeaderText="Remind">
  <ItemTemplate>
    <asp:ImageButton ID="btnEmail"  
        data-rider-name="<%# ((Result)((GridViewRow) Container).DataItem).Rider %>"
        data-rider-email="<%# ((Result)((GridViewRow) Container).DataItem).RiderEmail %>"
        CommandName="Email" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/images/email.gif" />
  </ItemTemplate> 
</asp:TemplateField>

В RowCommand вы делаете это:

void gvMyView_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Email")
    {
        var btnSender = (ImageButton)e.CommandSource;
        var riderName = btnSender.Attributes["data-rider-name"];
        var riderEmail = btnSender.Attributes["data-rider-email"];
        // Do something here
    }
}

Гораздо чище, чем взламывать все значения вместе с разделителями и снова распаковывать в конце.

Не забудьте протестировать / очистить любые данные, которые вы возвращаете со страницы, на случай, если они были подделаны!

5 голосов
/ 25 марта 2013

Мой подход заключается в использовании коллекции атрибутов для добавления HTML-атрибутов данных из кода позади. Это больше соответствует jquery и сценариям на стороне клиента.

// This would likely be done with findControl in your grid OnItemCreated handler
LinkButton targetBtn = new LinkButton();


// Add attributes
targetBtn.Attributes.Add("data-{your data name here}", value.ToString() );
targetBtn.Attributes.Add("data-{your data name 2 here}", value2.ToString() );

Затем получить значения через коллекцию атрибутов

string val = targetBtn.Attributes["data-{your data name here}"].ToString();
4 голосов
/ 09 января 2012

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

<asp:GridView ID="grdParent" runat="server" BackColor="White" BorderColor="#DEDFDE"
                           AutoGenerateColumns="false"
                            OnRowDeleting="deleteRow"
                         GridLines="Vertical">
      <asp:BoundField DataField="IdTemplate" HeaderText="IdTemplate" />
      <asp:BoundField DataField="EntityId" HeaderText="EntityId"  />
    <asp:TemplateField ShowHeader="false">
        <ItemTemplate>
           <asp:LinkButton ID="lnkCustomize" Text="Delete"  CommandName="Delete"  CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>'  runat="server"> 
           </asp:LinkButton>   
        </ItemTemplate>   
    </asp:TemplateField>
     </asp:GridView>

А на стороне сервера:

protected void deleteRow(object sender, GridViewDeleteEventArgs e)
{
    string IdTemplate= e.Values["IdTemplate"].ToString();
    string EntityId = e.Values["EntityId"].ToString();

   // Do stuff..
}
1 голос
/ 05 марта 2010

Либо сохраните его в коллекции ключей данных gridview, либо сохраните в скрытом поле внутри одной ячейки, либо объедините значения вместе.Это единственный путь.Вы не можете хранить два значения в одной ссылке.

0 голосов
/ 19 сентября 2016

Если вы хотите передать два значения , вы можете использовать этот подход

<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
 OnClick="RemoveFromRole_Click" />

В основном я рассматриваю {CommmandName, CommandArgument} как значение ключа. Установите оба из поля базы данных. Вам нужно будет использовать событие OnClick и в этом случае использовать событие OnCommand, которое я считаю более чистым кодом.

...