2012-03-29 84 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);