查询字符串值始终为0

时间:2013-04-20 04:36:54

标签: c# asp.net query-string

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

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

3 个答案:

答案 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)
    }
}