使用 onServerClick 获取 href 值

Get href value with onServerClick

我正在使用 asp.net 和 c#

我得到了一个 link 的列表,我想在后面的代码中获取 href 值。

到目前为止我有:

<li><a href="#?id='101'" runat="server" onServerClick="room_click">Room 101</a></li>
<li><a href="#?id='102'" runat="server" onServerClick="room_click">Room 102</a></li>
<li><a href="#?id='103'" runat="server" onServerClick="room_click">Room 103</a></li>

protected void room_click(object sender, EventArgs e)
{
}

问题是我找不到获取 href 值的解决方案,我尝试了锚点或正则表达式但它不起作用。

您必须将发件人转换为 HtmlAnchor 才能访问 属性:

    public void room_click(object sender, EventArgs e)
    {
        var href = ((System.Web.UI.HtmlControls.HtmlAnchor)sender).HRef;
    }
protected void room_click(object sender, EventArgs e)
{
    var anchor = sender as HtmlAnchor;
    if (anchor == null)
        return;

    var href = anchor.HRef;
    //--do something
}

你的 onServerClick 无论如何都会覆盖你的 href 而不是导致回发......所以我建议你把它全部删除并简单地拥有:

<li><a href="?id=101">Room 101</a></li>
<li><a href="?id=102">Room 102</a></li>
<li><a href="?id=103">Room 103</a></li>

然后在你后面的代码中:

protected void Page_Load(object sender, EventArgs e)
{
    RoomClick();
}

private void RoomClick()
{
    int roomId = 0;
    //check to see if the id in the querystring exists and that it parses as an int.
    if (!String.IsNullOrEmpty(Request.QueryString["id"]) && Int32.TryParse((Request.QueryString["id"]), out roomId))
    {
        //do something with roomId
    }
}

在我看来,这种方式似乎更直接/更易于使用。 Jason 的回答 也对您有用 。我认为这条路线令人困惑,因为虽然你可以读取 href 并获得该值,但你无法从 URL 读取 # 值......而这只是'这不是完成您想完成的事情的标准方法。另外,您打算如何轻松地从 href 中获得房间号?

我喜欢这条路线的另一个原因是你可以 link 某人直接进入房间而无需告诉他们先点击某些东西...如果 id 在那里,它将加载房间信息或您正在做的任何事情。

更新: 如果您不想要 URL 中的房间信息并且仍然想要 "PostBack" 方法,我的建议仍然是不同的路线。而是使用 LinkButton,这将是一种更 "traditional" 的方式(在 ASP.NET Web 表单中)来执行回发并传递数据:

因此,改为使用如下标记:

<li><asp:LinkButton ID="_room104" OnCommand="RoomCommand" CommandArgument="104" Text="Room 104" runat="server"></asp:LinkButton></li>
<li><asp:LinkButton ID="_room105" OnCommand="RoomCommand" CommandArgument="105" Text="Room 105" runat="server"></asp:LinkButton></li>

然后像下面这样的代码:

protected void RoomCommand(object sender, CommandEventArgs e)
{
    int roomId = 0;
    if (Int32.TryParse((string)e.CommandArgument, out roomId)) {
        //do something with roomId
    }
}