0

我一直在处理联系表格我是 ASP.net 的新手,我知道中等数量的 C# 我正在处理联系表格。我想将值作为 json 数组发送并用 JSON.net 解析它,我尝试了所有我能想到的方法来让它工作。如果没有成功,我需要知道如何从 ASMX 页面正确发送和接收 JSON。是否有示例文件或教程?或者有人可以告诉我我做错了什么吗?这是我可以让它阅读帖子变量的唯一方法。

但它只是 2 个数组而不是键值对。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="Scripts/jquery-2.0.3.min.js"></script>
</head>
 <body>
    <form action="#">
        <input type="text" id="firstname" name="firstname" value=""/>
        <input type="text" id="lastname" name="lastname" value=""/>
     </form>
  </body>
  </html>
 <script>

$(document).ready(function () {

    var $serialize = $('form').serializeArray();
    var stringify = JSON.stringify($serialize);

    var keys = ['firstname', 'lastname'];
    var list = [$('#firstname').val(), $('#lastname').val()];

    var jsonText = JSON.stringify({ args: list, keys: keys });

    $.ajax({

        url: "validation.asmx/sendRequest",
        method: "POST",
        dataType: "json",
        data:jsonText,
        cache: false,
        processData: true,
        contentType: "application/json; charset=utf-8"
    }).done(function (data) {

        console.log(data);

    });

});

</script>

这是我的 asmx 文件,

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using Newtonsoft.Json;
    using System.Web.Script.Services;
    using System.Data;

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [System.Web.Script.Services.ScriptService]
     public class validation : System.Web.Services.WebService {

        public validation () {

       //Uncomment the following line if using designed components 
       //InitializeComponent(); 
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string sendRequest(List<string> args, List<string> keys)
    {

       var arg = args;
       var key = keys;

       return args[0];

     }

   }

这是我的网络配置文件

<?xml version="1.0"?>
<configuration>
  <system.web>
     <compilation debug="true" targetFramework="4.5"/>
      <httpRuntime targetFramework="4.5"/>
       <webServices>
           <protocols>
             <add name="HttpGet"/>
             <add name="HttpPost"/>
           </protocols>
       </webServices>
    </system.web>
  </configuration>
4

3 回答 3

4

我可以一般地回答你。上面的代码似乎是您解决问题的尝试。

要传递字符串数组,请参见下面给出的 javascript 代码

    var MyStringArray = new Array();
    MyStringArray.push("firstval");
    MyStringArray.push("secondval");
var StringifiedContent = JSON.stringify('varName':MyStringArray);
        $.ajax({
                type: "POST",
                url: "validation.asmx/sendRequest",//Path to webservice
                data: StringifiedContent,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                }
            }); 

您可以在 webService 中接受它,如下所示

[WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string sendRequest(List<string> varName)//The variable name must be same
    {
      foreach(var eachvals in varName)
      {

      }

     }

如果您遵循如上所示的代码,则不必担心 JSON 格式。如果您不打算使用类似服务的操作,那么在页面返回中使用 [WebMethod] 将是一个更好的选择。

您可以传递用户定义的 javaScript 对象,而不是传递字符串。在这种情况下,

var MyStringArray = new Array();
   var MyObject = {};
   MyObject.Key="123";
   MyObject.Value="abc";
    MyStringArray.push(MyObject);

var StringifiedContent = JSON.stringify('varName':MyStringArray);
        $.ajax({
                type: "POST",
                url: "validation.asmx/sendRequest",//Path to webservice
                data: StringifiedContent,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                }
            }); 

然后,您可以在 webService 中接受它,如下所示

[WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string sendRequest(List<MyObject> varName)//The variable name must be same
    {
      foreach(var eachvals in varName)
      {
      string Keyval =eachvals.Key;
      string Value =eachvals.Value;
      }

     }
public class MyObject 
{
public string Key {get;set};
public string Value {get;set;}
}

或者,如果您不想为每个使用的方法创建类,您可以使用字典。

[WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string sendRequest(Dictionary<string,string> varName)//The variable name must be same
        {
          foreach(var eachvals in varName)
          {
          string Keyval =eachvals.["Key"];
          string Value =eachvals.["Value"];
          }

         }
于 2013-09-11T05:17:05.203 回答
0

.NET Framework 的标准 KevValuePair 类不起作用,仅仅是因为 setter 是私有的。

我在你的代码中看到你不是这方面的新手,所以只需创建一个带有公共 getter/setter 的小类,你就可以开始了。

[Serializable]
public class MyKVP
{
    public string k { get; set; }

    public string v { get; set; }
}

现在在您的 Web 方法中,您的签名应更改为:

public string sendRequest(MyKVP[] args);

您的 JavaScript 代码将需要此更改:

var kvps = [
    {k:'firstname', v: $('#firstname').val()},
    {k:'lastname', v: $('#lastname').val()} ];

var jsonText = JSON.stringify({ args: kvps });
于 2013-09-10T19:34:13.483 回答
0

您可以将其作为字符串获取并将其反序列化为对象。发送您的“jsonText”

我在我的项目中这样做。我只是将 FromJSON 放在一个类中并将其用作扩展 *您不必做类的事情

示例:“{args: ['aaa', 'bbb', 'ccc', 'ddd'], 键:['aaa', 'bbb', 'ccc', 'ddd']}”

*使用 System.Web.Script.Serialization;

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string sendRequest(string msg)
{
    MyClass mc = FromJSON<MyClass>(msg)
    return mc.args[0];

}

class MyClass
{
    internal string[] keys;
    internal string[] args;
}

T FromJSON<T>(string json)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    T o = serializer.Deserialize<T>(json);
    return o;
}
于 2013-09-10T19:23:53.557 回答