将代码隐藏方法绑定到 gridview 中的超链接
Bind a code-behind method to hyperlink in gridview
我想根据其 category.I 将用户重定向到已单击 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.Error 14 参数 1:无法从 'object' 转换为 'string'
2.Error 13 'Home.GetProfile(string)' 的最佳重载方法匹配有一些无效参数
3.Error 15 'System.Convert.ToString(object, System.IFormatProvider)' 的最佳重载方法匹配有一些无效参数
4.Error 16 参数 1:无法从 'void' 转换为 'object'
好吧,我不明白 It.I 我什至没有从方法中返回任何东西
评估 returns 一个对象,如果 UserId
在您的数据源中由字符串表示,则需要将其转换为字符串:
NavigateUrl='<%# GetProfile(Eval("UserId") as string) %>'
另一个问题是 Response.Redirect
没有 return 任何东西,而 oyu 想要 return URL。因此,只需删除此重定向和 return URl 即可。也不要忘记更改方法的 return 类型。
protected string GetProfile(string UserId)
...
if (category == "Player")
{
return "~/Profile-Player.aspx?UserId=" + UserId;
}
else
{
return "~/Profile-Doctor.aspx?UserId=" + UserId;
}
还有一些注意事项:
这个函数GetProfile
在数据绑定时调用,而不是在点击link时调用。如果您确实希望在单击 link 时调用某些内容,则需要一个 LinkButton 来生成网格视图命令,然后进行处理。但是,您当前的解决方案也应该有效。
当前代码将为每个 hyperlink 执行数据库连接。考虑向您的 gridview 的数据源添加更多信息,例如用户类型,以便您可以一次从数据库中获取所有数据。
我想根据其 category.I 将用户重定向到已单击 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.Error 14 参数 1:无法从 'object' 转换为 'string'
2.Error 13 'Home.GetProfile(string)' 的最佳重载方法匹配有一些无效参数
3.Error 15 'System.Convert.ToString(object, System.IFormatProvider)' 的最佳重载方法匹配有一些无效参数
4.Error 16 参数 1:无法从 'void' 转换为 'object'
好吧,我不明白 It.I 我什至没有从方法中返回任何东西
评估 returns 一个对象,如果 UserId
在您的数据源中由字符串表示,则需要将其转换为字符串:
NavigateUrl='<%# GetProfile(Eval("UserId") as string) %>'
另一个问题是 Response.Redirect
没有 return 任何东西,而 oyu 想要 return URL。因此,只需删除此重定向和 return URl 即可。也不要忘记更改方法的 return 类型。
protected string GetProfile(string UserId)
...
if (category == "Player")
{
return "~/Profile-Player.aspx?UserId=" + UserId;
}
else
{
return "~/Profile-Doctor.aspx?UserId=" + UserId;
}
还有一些注意事项:
这个函数
GetProfile
在数据绑定时调用,而不是在点击link时调用。如果您确实希望在单击 link 时调用某些内容,则需要一个 LinkButton 来生成网格视图命令,然后进行处理。但是,您当前的解决方案也应该有效。当前代码将为每个 hyperlink 执行数据库连接。考虑向您的 gridview 的数据源添加更多信息,例如用户类型,以便您可以一次从数据库中获取所有数据。