2011-03-16 51 views
0

我不從我的WebService數據回來,我不知道爲什麼。 :/Ajax與jQuery的,scriptmanager和webservice返回null

我有我的MasterPage.master這樣的:

<asp:ScriptManager id="scriptMng" runat="server"> 
     <Services> 
      <asp:ServiceReference Path="~/WebServices/Mailing.asmx" /> 
     </Services> 
    </asp:ScriptManager> 
    <asp:UpdatePanel runat="server" id="mailFormUpdatePanel" updateMode="Conditional"> 
     <ContentTemplate> 
       /* form */ 
     </ContentTemplate> 
    </asp:UpdatePanel> 

在我Mailing.asmx我有這樣的:

<%@ WebService Language="C#" CodeBehind="~/App_Code/Services/Mailing.cs" Class="Mailing" %> 

在我Mailing.asmx.cs我有這樣的:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Services; 
using System.Net.Mail; 
using System.Text.RegularExpressions; 

/// <summary> 
/// Summary description for Mailing 
/// </summary> 
[WebService(Namespace = "http://ktwebstudio.cz/WebServices/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService] 
public class Mailing : System.Web.Services.WebService 
{ 

    [WebMethod()] 
    public string Mail(string fromName, string fromSurename, string fromEmail, string fromPhone, string phoneTimeFrom, string phoneTimeTo, string selectedJob, string mailMsg) 
    { 
     if (fromName.Trim() != "" && fromSurename.Trim() != "" && fromName != "Jméno" && fromSurename != "Příjmení" && fromEmail.Trim() != "" && fromEmail != "E-mailová adresa (povinné)") 
     { 
      bool error = false; 
      if (fromPhone.Trim() != "" && fromPhone != "Telefonní číslo (nepovinné)") 
       error = !IsNumber(fromPhone.Trim()); 
      if (IsWord(fromName.Trim()) && IsWord(fromSurename.Trim()) && IsEmail(fromEmail.Trim()) && !error) 
      { 
       /* 
       some logic 
       */ 

       try { client.Send(mail); } 
       catch 
       { 
        return "Odesílání zprávy selhalo, zkuste prosím akci opakovat. <br />Při přetrvávajících problémech zkuste použít alternativní způsob kontaktování, který naleznetev sekci <a runat=\"server\" href=\"<%$RouteUrl:RouteName=contact%>\">kontakt</a>."; 
       } 
       return "Zpráva byla úspěšně odeslána, děkujeme."; 
      } 
      else 
       return "Vaše jméno, příjmení nebo jeden z Vášich vyplněných kontaktů obsahuje neplatné znaky."; 
     } 
     else 
      return "Musíte vyplnit Vaše jméno, příjmení a kontaktní email."; 
    } 

    public bool IsWord(string word) 
    { 
     Regex mask = new Regex(@"^[a-zA-Zá-žÁ-Ž]*$"); 
     return mask.IsMatch(word); 
    } 
    public bool IsEmail(string email) 
    { 
     Regex mask = new Regex(@"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$", RegexOptions.IgnoreCase); 
     return mask.IsMatch(email); 
    } 
    public bool IsNumber(string number) 
    { 
     int num; 
     return int.TryParse(number, out num); 
    } 
} 

所以在我的Masterpage.master.cs我測試如果瀏覽器支持JS,如果沒有我從OnClick方法調用Web服務這是在哪裏我認爲這是確定的:(不要問我爲什麼,我不希望有這一點,如果JS心不是支持)

Mailing mail = new Mailing(); 
statusMsgLbl = mail.Mail(txtName.Text, txtSurename.Text, txtMail.Text, txtPhone.Text, startTime.SelectedValue, endTime.SelectedValue, selectJob.SelectedValue, txtMessage.Text); 

但是,如果JS支持(我希望用戶有它打開),我有我的母版這個名爲.master jQuery和javascript代碼:

var msg; 
    Sys.Application.add_load(load); 
     function load() { 
     $('#submit').click(function() { 
      msg = Mailing.Mail($('#txtName').val(), $('#txtSurename').val(), $('#txtMail').val(), $('#startTime').val(), $('#endTime').val(), $('#selectJob').val(), $('#txtMessage').val()); 
     }); 
    } 
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequestHandler); 
     function beginRequestHandler() { 
      $(document.createElement('div')) 
         .attr('id', 'overlay') 
         .width($('#formBox').width()) 
         .height($('#formBox').height()) 
         .css({ backgroundImage: 'url(/Static/Img/bc_overlay.png)', position: 'absolute', left: 0, top: 0, margin: "5px", textAlign: "center", color: "#000", display: "none" }) 
         .append("<div id='loading' style='padding-top:100px'><strong>Odesílám</strong><br /><img src='Static/Img/ajax-loader.gif' width='33px' height='33px' alt='loading' /></div>") 
         .show(500) 
         .prependTo($('#formBox')); 
      $('#formBox').css('position', 'relative'); 
     } 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 
    function endRequestHandler() { 
     $('#loading').delay(2000).slideUp(800); 
     $('#overlay').append("<div style='padding-top:100px'><strong id='statusMsg'></strong></div>"); 
     if (msg != null) 
      $('#statusMsg').css('display', 'none').delay(2800).fadeIn(300).text(msg); 
     else 
      $('#statusMsg').css('display', 'none').delay(2800).fadeIn(300).text("Problém"); 
     $('#overlay').delay(6000).hide(800);          
    }  

第一功能用我的WebService。

第二個函數在beginRequest時做一些很酷的事情。

而去年功能時,endRequest做一些很酷的東西太+寫入錯誤/成功的消息 ..但我不明白,從Mailing.asmx.cs我的琴絃,我不知道爲什麼。 : - /我把最後的功能,如果(MSG!=空)...所以我知道味精爲空,如果你能告訴我爲什麼,我會很感激。

(我用$就在jQuery的嘗試它,但我得到的500錯誤,所以我用這種方式與Sys.WebForms.PageRequestManager。)

回答

0

我會建議你檢查以下點排查:

  1. 首先看看是否沒有任何java腳本錯誤。 IE8有開發者工具,可以讓你腳本調試,或者你可以使用Firefox & Firebug組合。
  2. 檢查請求/響應打算從/到瀏覽器 - 使用的工具,這樣的提琴手(或Firefox/Fiebug)
  3. 有可以在你的邏輯問題 - 所以儘量把alert在你的js代碼,看看代碼點被調用。當然,你實際上可以使用任何腳本調試器(包括visual studio)添加斷點並逐步完成。如果您不知道,您可以在js中使用debugger;語句來觸發調試器 - 瀏覽器會提示您使用可用的調試器進行附加。

因此,我更喜歡使用jquery ajax方法。這裏有幾條幫助你開始的文章:http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/http://www.dotnetfunda.com/articles/article1127-consuming-web-service-webmethod-from-jquery-in-aspnet-.aspx