我正在尝试使用会话在C#类之间传递字符串。我有一个名为Profile
的课程,它有一个搜索框。我有另一个名为SearchResults
的类,它应该在我的数据库中搜索在搜索框中输入的内容。
单击搜索按钮后,Profile
类中的此方法称为:
protected void Search(object sender, EventArgs e)
{
Response.Redirect("~/SearchResults.aspx");
String searchedItem = txt_search.Text;
Session["search"] = searchedItem;
}
这是Page_Load
页面中的SearchResults
方法:
protected void Page_Load(object sender, EventArgs e)
{
string searchedItem = (string)(Session["search"]);
string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString();
SqlConnection conn = new SqlConnection(connStr);
SqlCommand SearchGames = new SqlCommand("SearchGames", conn);
SearchGames.CommandType = CommandType.StoredProcedure;
SearchGames.Parameters.Add(new SqlParameter("@game_name", searchedItem));
conn.Open();
SqlDataReader rdr = SearchGames.ExecuteReader(CommandBehavior.CloseConnection);
}
我收到错误说我的
SearchGames过程需要一个@game_name参数,而不是 供给
,但很明显我已经通过了这个参数,这导致我认为SearchItem
有问题(或者我如何在两个类之间传递字符串。
答案 0 :(得分:3)
您在设置会话之前重定向,我认为您应该在设置会话后重定向:
String searchedItem = txt_search.Text;
Session["search"] = searchedItem;
Response.Redirect("~/SearchResults.aspx");
答案 1 :(得分:0)
不是试图通过会话传递参数,而是将其注入重定向:
protected void Search(object sender, EventArgs e)
{
Response.Redirect($"~/SearchResults.aspx?search={txt_search.Text}");
}
或者,如果不使用C#6,
protected void Search(object sender, EventArgs e)
{
Response.Redirect("~/SearchResults.aspx?search=" + txt_search.Text);
}
然后在Page_Load
内,将其更改为:
protected void Page_Load(object sender, EventArgs e)
{
string searchedItem = Request.QueryString["search"];
...
这样,您就可以避免通过全局变量传递值,这将使代码更加健壮并使测试更容易。