0

選択したチェックボックスからIDを取得し、それをdeleteメソッドに送信してから、そのIDをストアドプロシージャに渡すという問題があります。私が抱えている問題は、IDを( "232"、 "4323")ではなく間違った形式( "232,4323")で返すことです。そのため、ストアドプロシージャに値を渡す場合、問題が発生します。文字列形式のため。これがaspxの私のコードです。

function doTheDelete(doIDeleteTimeTracker) {
    var selectedTimeTrackerList = getSelectedTimeTrackerIDs();
    if (selectedTimeTrackerList.length > 0) {
        $.ajax({
            type: "POST",
            //url: "/Tasks/ViewTasks.aspx/deleteTasksAndLinkedItems",
            url: '<%=ResolveUrl("~/TimeTrackers/ViewTimeTrackers.aspx/deleteSelectedTimeTracker")%>',
            data: "{'DeleteTimeTracker' : '" + doIDeleteTimeTracker + "'," + "'TimeBill': ['" + selectedTimeTrackerList.join(',') + "']}",
            //dataaaaaa
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                var ss = data.d;
                if (ss.length > 0) {
                    for (var i = 0; i < ss.length; ++i) {
                        $.noty.consumeAlert({ layout: 'center', type: 'error', dismissQueue: true });
                        alert(ss[i]);
                    }
                }
                $("#viewTimeTrackersGrid").flexReload();
                showMessage('Successfully Removed Time Tracker');
            },
            error: function (data) {
                $.noty.consumeAlert({ layout: 'center', type: 'error', dismissQueue: true, modal: true });
                alert('Error Deleting Time Tracker');
                if (window.console) {
                    console.log(data);
                }
            }
        });
    } else {
        showMessage('No time tracker(s) are selected.');
    }
}

これがコードビハインドのdeleteメソッドです。

public static string[] deleteSelectedExpense(bool DeleteExpenses, String[] ExpId)
{
    var rList = new List<string>();
    //var canDeleteTasks = false;
    //var canDeleteTrackers = false;
    var canDeleteExpenses = false;
    var investigatorID = (int)HttpContext.Current.Session["InvestigatorID"];
    var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connect"].ToString());
    var cmd = new SqlCommand("p_Admin_Permissions_CanDeleteExpenses", conn);
    cmd.Parameters.Add(new SqlParameter("@InvestigatorID", SqlDbType.Int));
    cmd.Parameters["@InvestigatorID"].Value = investigatorID;
    cmd.CommandType = CommandType.StoredProcedure;
    try
    {
        conn.Open();
        canDeleteExpenses = (bool)cmd.ExecuteScalar();
    }
    catch (SqlException sql)
    {
        if (!rList.Contains("Can not connect to the database. Please try again."))
            rList.Add("Can not connect to the database. Please try again.");
    }
    catch (Exception ex)
    {
        if (!rList.Contains("An Error Occured"))
            rList.Add("An Error Occured");
    }
    finally
    {
        if (conn.State == ConnectionState.Open)
            conn.Close();
    }

    if (canDeleteExpenses)
    {
        foreach (var expense in ExpId)// expense ends up beng ("232,423") instead of just taking 1 string at a time ("232").....("423")...
        {

            if (canDeleteExpenses)
            {
                conn = new SqlConnection(ConfigurationManager.ConnectionStrings["OSCIDConnectionString"].ToString());
                cmd = new SqlCommand("p_CaseFiles_Expenses_DeleteExpenses", conn);
                cmd.Parameters.Add(new SqlParameter("@ExpID", SqlDbType.Int));
                cmd.Parameters["@ExpID"].Value = int.Parse(expense);
                cmd.Parameters.Add("@Message", SqlDbType.NVarChar, 50);
                cmd.Parameters["@Message"].Direction = ParameterDirection.Output;
                cmd.CommandType = CommandType.StoredProcedure;
                try
                {
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException sql)
                {
                    if (!rList.Contains("Error Connecting to the Database. Unable To Delete Expense(s)."))
                        rList.Add("Error Connecting to the Database. Unable To Delete Expense(s).");
                }
                catch (Exception ex)
                {
                    if (!rList.Contains("An Error Occured"))
                        rList.Add("An Error Occured");
                }
                finally
                {
                    if (conn.State == ConnectionState.Open)
                        conn.Close();
                }
            }
            else if (!canDeleteExpenses)
            {
                rList.Add("You do not have permission to delete Expenses");
            }
            else
            {
                if (!rList.Contains("You do not have permission to delete the Expense(s)."))
                    rList.Add("You do not have permission to delete the Expense(s).");
            }
        }
    }
    return rList.ToArray();
}

配列のajax呼び出しフォーマットの「データ:」にある可能性があると思います(いくつか試しました)

4

3 に答える 3

1

試す:

... 'TimeBill': ['" + selectedTimeTrackerList.join('","') + "']}" ...

より良い解決策は、必要なプロパティを使用して完全なjavascriptオブジェクトを作成し、それを引数としてapsすることです。ところで、このページでのみこのメソッドを呼び出す場合は、jQueryの代わりにPageMethodsのようなものを使用することを検討することをお勧めします。

于 2012-09-19T14:34:56.013 に答える
1

として送信する文字列を作成する理由はありませんData。代わりにjsonオブジェクトを送信できます。

Data: { 
        DeleteTimeTracker: doIDeleteTimeTracker, 
        TimeBill: selectedTimeTrackerList 
      }, ...
于 2012-09-19T14:35:57.043 に答える
1

ヘルプジェントに感謝します。私はなんとかそれを修正することができました。解決策はこれを行うことでした:

 "'ExpId': ['" + selectedExpensesList.join('\',\'') + "']}",

それ以外の :

 "'ExpId': ['" + selectedExpensesList.join(',') + "']}",

余分な'を追加することはうまくいったようです。次に、配列全体を取得して私をうんちするのではなく、各IDを個別に取得することができます

于 2012-09-19T14:58:05.500 に答える