1

これはおそらく簡単なものですが、何が悪いのかわかりません..

次の文字列が URL に追加されています: /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"]);

null の場合、Convert.ToInt32関数は 0 を返します。

使用してみてInt32.Parse(Request.QueryString["pid"])、null 値の例外が発生するかどうかを確認してください。

はいの場合、に値はありませpidQuery stringpidクエリ文字列の送信元を確認してください。

さらに

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 に答える