2012-03-29 154 views
0

我很難爲.NET WebServices製作動態的AJAX表單子方法。C#WebService發送標準發佈請求正文,用JSON響應

這個想法是發送一個從窗體中的所有輸入動態構建的請求。然後讓服務器以JSON響應。

表單提交時,該被調用時,它填補與索引作爲輸入字段名稱和值作爲值的數組:

var params = []; 

for(var i in inputs) 
{ 
    if(inputs[i].type == 'text' || inputs[i].type == 'password') 
    { 
     params[inputs[i].name] = inputs[i].value; 
    } 
} 

當發送AJAX請求我運行一個循環到產生請求體:

var l = 0; 
for(var i in parameters) 
{ 
    this.parameters += (l > 0 ? '&' : '') + i + '=' + parameters[i]; 
    l++; 
} 

其給出這樣的結果:

foo=bar&lol=haha 

的問題是,腳本servicse只接受JSON作爲請求體,因爲裝飾的:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

正如我希望它返回一個JSON字符串,而不是XML。

有沒有簡單的解決方案?

回答

1

我想出瞭解決的辦法是一個相當複雜的工作,周圍的東西,應該很簡單。基本上我做了一個接受Xml格式的函數。然後將數據添加到更新模型,該模型使用由客戶端輪詢的更新方法格式化爲JSON。

下面是一個例子:

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[ScriptService] 
public class JsonHTTPService : System.Web.Services.WebService 
{ 
    static JavaScriptSerializer JSON = new JavaScriptSerializer(); 

    [WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public dynamic update() 
    { 
     if (Session["user"] == null) 
     { 
      Session.Add("user", new User()); 
     } 

     User user = (User)Session["user"]; 
     user.responseModel = new ResponseModel(); 

     if (user.updateListeners.Count > 0) 
     { 
      foreach (var updateMethod in user.updateListeners) 
      { 
       updateMethod.run(); 
      } 
      return JSON.Serialize(user.responseModel); 
     } 
     return null; 
    } 

    [WebMethod(EnableSession = true)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Xml)] 
    public void login(string email, string password) 
    { 
     if (Session["user"] == null) 
     { 
      return; 
     } 

     User user = (User)Session["user"]; 
     if (user.logged) 
     { 
      return; 
     } 

     if (user.Authenticate(email,password)) 
     { 
      user.logged = true; 
      user.updateListeners.Add(new LoginScreenRemover()); 
     } 
    } 
} 
0

試試這個JSON.stringify(params);