【问题标题】:ASP.NET set value in Repeater and have it passed into codebehindASP.NET 在Repeater 中设置值并将其传递到代码隐藏中
【发布时间】:2011-04-03 19:49:27
【问题描述】:

我有一个由Repeater 创建的asp:HyperLink 列表。当我点击其中一个HyperLinks 时,我希望它将HyperLink 中设置的值传递到后面的代码中,这样我就知道点击了哪个HyperLink。所以...

<asp:Repeater id="rpt1" runat="server">
    ...some rows of HyperLinks..
   <li><asp:HyperLink ID="hlValue" CssClass='example8' NavigateUrl="#" 
       OnClick="passavalue(books)" >books</asp:hyperlink></li>
    ...
</asp:repeater>

c#

static void passavalue(string value)
{
    response.Write(vlaue);
}

我知道这行不通我只是想解释一下我要做什么。

【问题讨论】:

  • 由于某种原因堆栈溢出撕掉了我写的所有 html,所以这没有任何意义。



    static void passavalue(string value) { response.Write(vlaue); }

  • 点击超链接时,您是否希望在不刷新页面的情况下发生某些事情,例如。通过 Ajax?

标签: c# asp.net repeater hyperlink


【解决方案1】:

在我看来,您最好的选择是在为每个超链接设置的 NavigationUrl 中使用 QueryString 或 Route 参数...您的转发器可以使用 DataBinder 行为为每个链接设置自定义值 等等...

【讨论】:

  • 当他们点击超链接时,它会打开一个颜色框,我有另一个转发器,这取决于他们点击的内容,我想在颜色框中订购转发器,以便他们点击的值首先出现。如果我使用 navigateurl,这将使我离开页面以应用 querystrin,我不想这样做。我需要它在点击时运行一个方法。
  • 啊,在这种情况下,您将不得不采用 Peter 下面的方法,或者您需要使用类似的函数调用在 javascript 中进行操作......就像您的“ passavalue()"..
【解决方案2】:

一种选择是在 ItemTemplate 中使用 asp:linkbutton 而不是 asp:hyperlink。

<asp:LinkButton runat="server" ID="DoSomethingLink" CommandName="DoSomething" CommandArgument='<%# Eval("Name") %>'><%# DataBinder.Eval(Container.DataItem, "Name") %></asp:LinkButton>

然后您将处理中继器的 ItemCommand 事件。

protected void YourRepeater_ItemCommand(object source, RepeaterCommandEventArgs e) 
{ 
    if (e.CommandName == "DoSomething") 
    { 
        var arg = e.CommandArgument; 
        // do something ...
    } 
} 

【讨论】:

  • 我要补充一点,LinkBut​​ton 是一个常规的超链接,它使用 JavaScript 来 POST 到服务器(模拟一个真实的按钮),因此存在可访问性和 SEO 问题。我会避免在面向公众的网站上使用它,但内部/内部网站很好。
【解决方案3】:

您可以通过绑定到 CommandArgument 某个值(我猜可能是一个 ID)来做到这一点。这是一个LinkButton 的示例,您可以将其添加到您的Repeater ItemTemplate

<ItemTemplate>
    <div>
        <asp:LinkButton ID="lbTest" runat="server"
            CommandArgument='<%# Eval("ID") %>' Text='<%# Eval("Text") %>' 
            OnClick="lbTest_Click" />
    </div>
</ItemTemplate>

然后,您可以通过为LinkButton 实现OnClick 来获取价值服务器端。如果您愿意并且不必为RowCommand 事件而烦恼,您甚至可以对中继器中的所有按钮进行相同的操作。

protected void lbTest_Click(object sender, EventArgs e)
{
    LinkButton lb = (LinkButton)(sender);
    string valueYouWanted = lb.CommandArgument;
    // do something with it
}

编辑:根据阅读您添加的代码,如果您想坚持使用asp:HyperLink 而不是链接按钮,OnClick 将触发 javascript,而不是服务器端,所以您会需要使用 &lt;%# Eval("ID") %&gt; (或您想要使用的任何字段)将唯一标识符添加到您的 javascript 内联。示例:

<asp:HyperLink ID="hlValue" CssClass='example8' NavigateUrl="#"  
    OnClick='passavalue(<%# Eval("YourBookID") %>)' >books</asp:hyperlink>

【讨论】:

  • @phil crowe 这些答案对你有用吗?如果没有,请编辑您的问题,我们可以尝试提供一些更好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多