2016-01-18 52 views
-1

我已經在一個aspx的ASP按鈕:ASP.NET Web表單 - 調用C#方法與AJAX

<asp:Button id="btnReport2" name="btnReport2" runat="server" class="gradientBlueBtn" Text="Show Report" OnClientClick="Alert();" ToolTip="Report"/> 

正如你所看到的,我打電話給它使用AJAX調用C#中的javascript函數方法。我這樣做:

<script> 
    function Alert() 
      { 
       $.ajax({ 
        type: "POST", 
        url: "Selection.aspx/GetReport", 
        contentType: 'application/json; charset=utf-8', 
        dataType: 'json', 
        success: function() 
        { 
         alert('success'); 
        }, 
        error: function() 
        { 
         alert('error'); 
        } 
       }); 

      } 
</script> 

事情是,我總是收到錯誤信息,當我點擊按鈕。有什麼我做錯了嗎?

編輯:C#方法。我已經設置了一個斷點來查看該方法是否被調用,但顯然不是。

public void GetReport() 
{ 
    AddFilters(); 
    decimal localCurrencyRate;    
    App_Data.BulkImportDSTableAdapters.ClientsTableAdapter tadptClients = new App_Data.BulkImportDSTableAdapters.ClientsTableAdapter(); 
    string legalEntityID = string.Empty;   
    if (txtSrcSys.Text != null) 
    { 
     DataTable dtSSYS = tadptClients.GetLegalEntityID(txtSrcSys.Text); 
     if (dtSSYS.Rows.Count > 0) 
     { 
      legalEntityID = Convert.ToString(dtSSYS.Rows[0][0]); 
     } 
    } 
    DateTime dtInvoiceFrom = DateTime.ParseExact(txtInvoiceFrom.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture); 
    DateTime dtInvoiceTo = DateTime.ParseExact(txtInvoiceTo.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture); 
    string strInvoiceFrom = String.Format("{0:yyyyMMdd}", dtInvoiceFrom); 
    string strInvoiceTo = String.Format("{0:yyyyMMdd}", dtInvoiceTo); 
    string localCurrency = dbcon.getLocalCurrency(legalEntityID); 
    DataSet localCurrencyDs = dbcon.getCurrencyRate(localCurrency, strInvoiceFrom); 
    if (Convert.ToDecimal(localCurrencyDs.Tables[0].Rows[0]["rate"]) == 0) 
     localCurrencyRate = Convert.ToDecimal(localCurrencyDs.Tables[0].Rows[1]["rate"]); 
    else 
     localCurrencyRate = Convert.ToDecimal(localCurrencyDs.Tables[0].Rows[0]["rate"]); 
    string fileQuery = string.Empty; 
    if (cbxExpYes.Checked == true && cbxExpNo.Checked == false) 
    {     
     fileQuery = File.ReadAllText(Server.MapPath("~/temp/Query.txt")).Replace("{1}", "XFORM_AREA.IMPORT_GE_MAIN_V15BIS m"); 
     fileQuery = fileQuery.Replace(":param1", localCurrencyRate.ToString()); 
     fileQuery = fileQuery.Replace("{0}", qb.getFilters().Replace("P.", "m.")); 
    } 
    if (cbxExpYes.Checked == false && cbxExpNo.Checked == true) 
    {    
     fileQuery = File.ReadAllText(Server.MapPath("~/temp/Query.txt")).Replace("{1}", "PREIMPORT_GE_MAIN m"); 
     fileQuery = fileQuery.Replace(":param1", localCurrencyRate.ToString()); 
     fileQuery = fileQuery.Replace("{0}", qb.getFilters().Replace("P.", "m.")); 
    } 
    if (cbxExpYes.Checked == true && cbxExpNo.Checked == true) 
    {    
     fileQuery = File.ReadAllText(Server.MapPath("~/temp/QueryUnion.txt")); 
     fileQuery = fileQuery.Replace("{ParamValues}", "pg.DEFVAL "); 
     fileQuery = fileQuery.Replace("{ParamTab}", "ref_var_def pg"); 
     fileQuery = fileQuery.Replace("{ParamCond}", "pg.NM = 'WL_REPORTING_CUR'"); 
     fileQuery = fileQuery.Replace("{0}", qb.getFilters().Replace("P.", "m.")); 
     fileQuery = fileQuery.Replace("{1}", qb.getFilters().Replace("P.", "i.")); 
    } 
    ASPxPivotGrid1.OptionsFilter.ShowOnlyAvailableItems = true; 
    int indexTravFullName = 0; 
    int indexEndTravFullName = 0; 
    string paramToRemove = string.Empty; 

    indexTravFullName = fileQuery.IndexOf("AND PR.ST_TRAVELLER_FULL_NAME LIKE"); 
    if (indexTravFullName > 0) 
    { 
     indexEndTravFullName = fileQuery.Substring(indexTravFullName).IndexOf("AND", 3); 
     paramToRemove = fileQuery.Substring(indexTravFullName, indexEndTravFullName); 
     fileQuery = fileQuery.Replace(paramToRemove, string.Empty); 
    } 

    if (!string.IsNullOrEmpty(fileQuery)) 
    { 


     DataSet dsTravels = new DataSet(); 

     oCmd.CommandText = fileQuery; 
     oCmd.CommandType = CommandType.Text; 
     oCmd.Connection = oConn; 
     odpter.SelectCommand = oCmd; 


     odpter.SelectCommand.Parameters.Add(":pSourceSystem", txtSrcSys.Text); 
     odpter.SelectCommand.Parameters.Add(":pInvoiceFrom", strInvoiceFrom); 
     odpter.SelectCommand.Parameters.Add(":pInvoiceTo", strInvoiceTo); 

     if (!String.IsNullOrWhiteSpace(txtCustomNr.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":pCustomerNr", txtCustomNr.Text); 
     } 
     if (!String.IsNullOrWhiteSpace(txtIATA.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":Iata", txtIATA.Text); 
     } 
     if (!String.IsNullOrWhiteSpace(txtCurrCode.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":CurrCode", txtCurrCode.Text); 
     } 
     if (!String.IsNullOrWhiteSpace(txtInvoiceNrFrom.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":pInvoiceNrFrom", txtInvoiceNrFrom.Text); 
     } 
     if (!String.IsNullOrWhiteSpace(txtInvoiceNrTo.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":pInvoiceNrTo", txtInvoiceNrTo.Text); 
     } 
     if (!String.IsNullOrWhiteSpace(txtDossierNrFrom.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":pDossierNrFrom", txtInvoiceNrFrom.Text); 
     } 
     if (!String.IsNullOrWhiteSpace(txtDossierNrFrom.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":pDossierNrTo", txtInvoiceNrFrom.Text); 
     } 
     if (!String.IsNullOrWhiteSpace(txtTravellerName.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":pTravellerName", txtTravellerName.Text); 
     } 
     if (chbxSale.Checked) 
     { 
      odpter.SelectCommand.Parameters.Add(":pSale", "SA"); 
     } 
     if (chbxRefund.Checked) 
     { 
      odpter.SelectCommand.Parameters.Add(":pRefund", "RE"); 
     } 
     if (hfTravelWith.Value.Contains("chbxairs")) 
     { 
      odpter.SelectCommand.Parameters.Add(":pProductAir", "7"); 
     } 
     if (hfTravelWith.Value.Contains("chbxhotels")) 
     { 
      odpter.SelectCommand.Parameters.Add(":pProductHotel", "3"); 
     } 
     if (hfTravelWith.Value.Contains("chbxcars")) 
     { 
      odpter.SelectCommand.Parameters.Add(":pProductCar", "1"); 
     } 
     if (hfTravelWith.Value.Contains("chbxrails")) 
     { 
      odpter.SelectCommand.Parameters.Add(":pProductRail", "6"); 
     } 
     if (hfTravelWith.Value.Contains("chbxmisc")) 
     { 
      odpter.SelectCommand.Parameters.Add(":pProductMisc", "9"); 
     } 

     if (!String.IsNullOrWhiteSpace(txtBatchNr.Text)) 
     { 
      odpter.SelectCommand.Parameters.Add(":pBatchNr", txtBatchNr.Text); 
     } 


     odpter.MissingSchemaAction = MissingSchemaAction.AddWithKey; 
     odpter.Fill(dsTravels, "ReportTab"); 
     int count = dsTravels.Tables[0].Rows.Count; 
     DataTable dt = dsTravels.Tables[0]; 


     if (dt.Rows.Count > 0) 
     { 

      ASPxPivotGrid1.DataSource = dt; 
      ASPxPivotGrid1.DataBind(); 
      Session["dtReport"] = dt; 
      //ASPxPivotGrid1.Prefilter.CriteriaString = "[" + "" + "]"; 
     } 
    } 
} 
+0

添加錯誤消息,將是有益的。 –

+0

請爲您的#GetReport方法添加c#代碼 –

+1

請參閱http://stackoverflow.com/questions/27917255/c-sharp-web-method-is-not-calling-in-javascript/27917333#27917333 – Mairaj

回答

4

您的方法必須被聲明爲static,並飾以[WebMethod]獲取更多細節。所以,你的方法應該是:

[WebMethod] 
public static void GetReport() 
{ 
    // Your code here 
} 

欲瞭解更多信息,請看看this post

編輯!

我看到你在你的代碼中使用了一些控件(如txtInvoiceFrom,txtInvoiceTo)。在制定方法static之後,您無法再訪問這些控件。爲了解決這個問題,請按照下列步驟操作(以txtInvoiceTo爲例):

  1. 不要使用txtInvoiceTo.Text或類似的東西得到的數據。將其作爲參數傳遞。
  2. 從客戶端獲取txtInvoiceTo數據,使用jQuery或其他(您的選擇),並將其傳遞到Ajax以發佈到服務器。
  3. 要獲得txtInvoiceTo數據由jQuery,你可以這樣做:$('#<%= txtInvoiceTo.ClientID %>').val()
+0

感謝您的回答。但是,我多次得到這個錯誤:需要一個對象引用來訪問非靜態字段方法或屬性。 – Traffy

+0

分享你的錯誤的截圖將是非常有用的:) 此外,創建一個非常簡單的方法(只是返回一個'int')並調用它,以證明你可以使用AJAX調用方法。我懷疑你的C#代碼中有錯誤。 – AnhTriet

+0

我用另一種方法測試過,它工作(此方法只返回一個控制檯消息)。我最初的方法的問題是,添加關鍵字static將在aspx中聲明的所有文本框,複選框......強調爲非靜態。 – Traffy

2

你的方法必須是靜態[的WebMethod]如下, why should make it static and decorate with [WebMethod]?

[WebMethod] 
public static void GetReport() 
{ 
    // Your code here 
} 

$.ajax({ 
    type: "POST", 
    url: "Selection.aspx/GetReport", 
    data: JSON.stringify({ parametername : "Parameter Value" }), 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    success: function() 
    { 
     alert('success'); 
    }, 
    error: function() 
    { 
     alert('error'); 
    } 
}); 
+0

感謝您的回答,但我沒有在我的功能中使用任何參數。 – Traffy

+0

加你c#代碼 –

1

嘗試使用這種類型的格式。

[System.Web.Services.WebMethod] 
public static void GetReport() 
{ 
} 


[System.Web.Services.WebMethod] 
public static void GetReport(string name) 
{ 
} 

http://www.aspsnippets.com/Articles/Call-ASPNet-Page-Method-using-jQuery-AJAX-Example.aspx

+0

如果這是你的答案,那麼標記爲這個職位的答案 –

+0

感謝您的回答。但是,我多次得到這個錯誤(如文本框,標籤等aspx元素):需要一個對象引用來訪問非靜態字段方法或屬性。 – Traffy

+0

您需要通過ajax調用作爲參數傳遞文本框值,並使用方法中的那些值。 –