这可能很容易,但我看不出有什么问题。
我将此字符串添加到我的网址:/projects.aspx?pid=3
在我的代码后面,我试图像这样抓住这个值:
public partial class Projects : System.Web.UI.Page
{
public int pid { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
pid = Convert.ToInt32(Request.QueryString["pid"]); //this is returning 0 when it should have a value.
DataBind(true);
PopulateTestSuiteList();
}
TestSuitesDataList.ItemCommand += new RepeaterCommandEventHandler(this.Item_Command);
}
当我尝试在其他函数中查看pid的值时,它总是给我'0'。我不明白为什么它不会给我3它应该的呢?
以下是示例函数:
private void ExecuteInsert(string TestSuiteName, string TestSuiteDescription, int ProjectID)
{
SqlConnection conn = new SqlConnection(GetConnectionString());
string sql = "INSERT INTO TestSuites (ProjectID, TestSuiteName, TestSuiteDescription) VALUES " + " (@ProjectID,@TestSuiteName,@TestSuiteDescription)";
try
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlParameter[] param = new SqlParameter[3];
param[0] = new SqlParameter("@TestSuiteName", SqlDbType.NVarChar, 50);
param[1] = new SqlParameter("@TestSuiteDescription", SqlDbType.NVarChar, 200);
param[2] = new SqlParameter("@ProjectID", SqlDbType.Int);
param[0].Value = TestSuiteName;
param[1].Value = TestSuiteDescription;
param[2].Value = pid;
for (int i = 0; i < param.Length; i++)
{
cmd.Parameters.Add(param[i]);
}
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
catch (System.Data.SqlClient.SqlException ex)
{
string msg = "Insert Error:";
msg += ex.Message;
throw new Exception(msg);
}
finally
{
conn.Close();
}
}
protected void AddTestSuiteButton_Click(object sender, EventArgs e)
{
//checks whether the test suite name already exists in the database and stops duplicates from being added for the same project
string checkExistsQuery = "SELECT TestSuiteName FROM TestSuites WHERE TestSuiteName = @TestSuiteName and @ProjectID = " + pid;
SqlConnection conn = new SqlConnection(GetConnectionString());
SqlCommand checkExistsCmd = new SqlCommand(checkExistsQuery, conn);
SqlParameter c1 = new SqlParameter("TestSuiteName", TxtTestSuiteName.Text);
SqlParameter c2 = new SqlParameter("ProjectID", pid);
checkExistsCmd.Parameters.Add(c1);
checkExistsCmd.Parameters.Add(c2);
conn.Open();
SqlDataReader rd = checkExistsCmd.ExecuteReader();
if (rd.HasRows)
{
lblAddTestSuiteMessage.Text = "Oops, a Project with that name already exists.";
rd.Close();
conn.Close();
}
else
{
string FormattedTestSuiteDescription = TxtTestSuiteDescription.Text.Replace("\r\n", "<br />");
//call the method to execute insert to the database
ExecuteInsert(TxtTestSuiteName.Text, FormattedTestSuiteDescription, pid);
lblAddTestSuiteMessage.Text = "Project has been added successfully";
ClearControls(Page);
}
rd.Close();
conn.Close();
Response.Redirect(Request.RawUrl);
}
在后面的代码中,这个函数似乎很高兴地拉出正确的数据并在我的页面上显示它 - 它也在使用PID?
private void PopulateTestSuiteList()
{
SqlConnection conn = new SqlConnection(GetConnectionString());
conn.Open();
string sql = "SELECT TestSuiteID, ProjectID, TestSuiteName, TestSuiteDescription FROM TestSuites WHERE ProjectID = " + pid + "ORDER BY TestSuiteName ASC";
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
TestSuitesDataList.DataSource = rd;
TestSuitesDataList.DataBind();
}
conn.Close();
}
答案 0 :(得分:2)
这可能是因为没有完全理解page life cycle。您在pid
上设置Page_Load
,但可能在页面尚未加载或重新加载时(例如在回发后)使用它。
如果您从查询字符串中获取pid
值并需要在回发时使用它,则需要将其存储在会话变量或隐藏字段在页面上。将它分配给页面类变量将不会像你在这里那样持久化。
答案 1 :(得分:1)
由于您使用Convert.ToInt32
作为
Convert.ToInt32(Request.QueryString["pid"]);
如果它为null Convert.ToInt32
,函数将返回0。
尝试使用Int32.Parse(Request.QueryString["pid"])
并查看天气是否获得空值异常。
如果是,则pid
中的Query string
没有值。检查您在查询字符串中发送pid
的位置。
您还可以使用Session
,因为编辑或更新事件时可能会丢失值。所以你可以按照以下方式做到这一点
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
if(Request.QueryString["pid"]!=null && Session["pid"]!=null)
pid = Convert.ToInt32(Request.QueryString["pid"]);
DataBind(true);
PopulateTestSuiteList();
}
TestSuitesDataList.ItemCommand += new RepeaterCommandEventHandler(this.Item_Command);
}
并在您的函数ExecuteInsert
函数
private void ExecuteInsert(string TestSuiteName, string TestSuiteDescription)
{
SqlParameter c2 = new SqlParameter("ProjectID", Int32.Parse(Session["pid"].ToString()));
答案 2 :(得分:1)
我会检查每个不方便的值,例如null或无效的字符串,我的代码是:
if (Request.QueryString["pid"] != null)
{
int pid;
if (int.TryParse(Request.QueryString["pid"].ToString(), out pid))
{
//Then its OK and you have an
//integer, put the codes here
}
else
{
//The query string has value
//but the value is not valid
//(not an integer value)
}
}