将代码隐藏方法绑定到gridview中的超链接

时间:2015-10-21 18:03:02

标签: c# asp.net gridview eval

我想将用户重定向到点击的UserId的个人资料页面,具体取决于其类别。我有以下代码隐藏方法:

  protected void GetProfile(string UserId)
{
    string CS = ConfigurationManager.ConnectionStrings["ss"].ConnectionString;
    using (SqlConnection con = new SqlConnection(CS))
    {
        con.Open();
        SqlCommand cmd = new SqlCommand("Select Category from tblAllUsers where UserId=@UserId", con);
        cmd.Parameters.AddWithValue("@UserId", UserId);
        string category = (string)cmd.ExecuteScalar();
        if (category == "Player")
        {
            Response.Redirect("~/Profile-Player.aspx?UserId=" + UserId);
        }
        else
        {
            Response.Redirect("~/Profile-Doctor.aspx?UserId=" + UserId);
        }
    }
}

我想在点击超链接时调用上述方法,该超链接放在gridview中,如下所示:

  <asp:HyperLink ID="lblCreator" runat="server" NavigateUrl='<%# GetProfile(Eval("UserId")) %>' Text='<%#String.Format("{0} {1}",Eval("FirstName"),Eval("LastName"))%>'></asp:HyperLink>

但它引发了许多例外,例如

1.错误14参数1:无法转换对象&#39;到&#39;字符串&#39;
2.错误13最佳重载方法匹配&#39; Home.GetProfile(string)&#39;有一些无效的论点 3.Error 15最佳重载方法匹配&#39; System.Convert.ToString(object,System.IFormatProvider)&#39;有一些无效的论点 4.错误16参数1:无法转换为&#39; void&#39;对象&#39;

好吧,我没有得到它。我甚至没有从方法中返回任何东西

1 个答案:

答案 0 :(得分:1)

如果数据源中的字符串表示UserId,则Eval会返回一个对象,您需要将其转换为字符串:

NavigateUrl='<%# GetProfile(Eval("UserId") as string) %>'

另一个问题是Response.Redirect没有返回任何内容,而oyu想要返回URL。所以只需删除此重定向并按原样返回URl。另外,不要忘记更改方法的返回类型。

protected string GetProfile(string UserId)
...
    if (category == "Player")
    {
        return "~/Profile-Player.aspx?UserId=" + UserId;
    }
    else
    {
        return "~/Profile-Doctor.aspx?UserId=" + UserId;
    }

还有几个笔记:

  1. 在数据绑定期间调用此函数GetProfile,而不是在单击链接时调用。如果您确实希望在单击链接时调用某些内容,则需要LinkBut​​ton来生成网格视图命令,然后处理该命令。但是,您当前的解决方案也应该有效。

  2. 当前代码将为每个超链接建立数据库连接。考虑向gridview的数据源添加更多信息,例如用户类型,以便您可以一次性从DB中获取所有数据。