1

这可能很容易,但我看不出有什么问题..

我将此字符串添加到我的网址:/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();
    }
4

3 回答 3

2

这可能是由于没有完全了解页面生命周期造成的。您正在设置pidon Page_Load,但可能在页面尚未加载或重新加载时(例如在回发之后)在某处使用它。

如果您pid从查询字符串中获取值并需要在回发时使用它,则需要将其存储在会话变量或页面上的隐藏字段中。将其分配给页面类变量不会像您在这里所做的那样持久化。

于 2013-04-20T05:09:23.280 回答
1

由于您使用Convert.ToInt32的是

 Convert.ToInt32(Request.QueryString["pid"]);

如果它是 nullConvert.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()));
于 2013-04-20T04:47:29.533 回答
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)
    }
}
于 2013-04-20T05:01:40.407 回答