如何通过POST变量循环发送到ASP.NET WebMethod从JQuery $ .ajax方法?

问题描述:

我有一个使用HTML按钮创建的清单,可以在点击时在'selected'和'unselected'类之间切换。每个选项都有一个与其相关的ID,还有一个可选的注释输入。

我想用POST来使用JQuery $ .ajax()方法来发送所选按钮的ID和相关注释。这个想法我已经是当“保存”被点击,像这样创造选择的ID和它们各自的评论的键/值集合:

selections = "{id1: 'comment1', id2: 'comment2', ...}" 

然后将它传递给的$就数据部分()方法如下所示:

$.ajax({ 
    type: "POST", 
    url: "MyPage.aspx/MyMethod" 
    data: selections, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     onSuccess(msg); 
    } 
}); 

最后通过HttpContext.Current.Request.Form循环访问MyMethod的选择。

但是当我尝试这个时,HttpContext.Current.Request.Form总是空的。我的方法错了吗?如果是这样,为什么?任何人都可以建议另一种方法

任何帮助将不胜感激。提前致谢!

另外,我知道的4种方式来调用从jQuery AJAX API服务器方法:方法之间

  1. 页面方法(在.aspx页面中的静态方法与[WebMethod]修改)
  2. switch语句在一个ashx的页面
  3. Web服务
ProcessRequest一个.aspx页面中方法之间
  • switch语句的

    哪种方式最高效?我假设2会涉及一个不必要的页面实例,所以不应该是那个。

  • 首先,确保你的选择变量是有效的JSON,你在你的问题中写的是无效的JSON表示法。

    其次,在你的webmethod定义中,让MyMethod接收一个字符串作为参数;可以说你将它声明为

    [WebMethod] 
    public MyMethod(string selections) 
    { 
        //Do processing here 
    } 
    

    在你的方法体,反序列化使用JavascriptSerializer在Dictionary<string,string>的字符串,例如:

    JavascriptSerializer js = new JavascriptSerializer(); 
    Dictionary<string,string> result = js.Deserialize<Dictionary<string,string>>(selections); 
    

    现在,你可以通过在元素循环您字典。

    为了澄清,您的选择变量需要将每个属性用引号引起来;你的情况,ID1,ID2 ......必须是 'ID1': '评论', 'ID2': '评论' 等

    编辑

    添加代码,用以演示Web服务应该被调用。

    var selections = "{'id1': 'comment1', 'id2': 'comment2'}"; 
    
    $.ajax({ 
        type: "POST", 
        url: "MyPage.aspx/MyMethod" 
        data: JSON.stringify(selections), 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function(msg) { 
         onSuccess(msg); 
        } 
    }); 
    

    作为最后的建议,熟悉的jsfiddle,它可以让你快速测试的东西。例如,See this

    +0

    谢谢你的回答。我一直在关注你的指示并试图让它工作。首先,我想你实际上期望我通过'{selections:'{id1:'comment1'}'}'而不是仅仅是{{id1:'comment1'}'对吗?只有这样我才能在'MyMethod'中检索'选择'。我用'selections'参数的字符串值''[Object object]''进入'MyMethod'。我无法反序列化这个。我会在劳动节周末之后回来,再次努力,并让你知道它是如何发生的。再次感谢! – FBNMDN

    +0

    @ user924092看我的编辑。我写了你需要从客户端做的事情。你非常接近。 – Icarus

    +0

    如果我们按照您的编辑传递数据,那么'MyMethod'中的参数必须是'(string id1,string id2)'和NOT'(string selections)'。这不能解决我的问题,因为ids的数量是不可预测的。 – FBNMDN

    选择变量应该是一个对象而不是字符串。

    var selections = { id1: 'a', id2: 'b' }; 
    
    +0

    谢谢你的回答。但是由于Page Methods期望一个包含JSON的字符串被发布,所以我把JSON对象放在一个字符串中。 – FBNMDN