【问题标题】:Pass Dictionary From Ajax to C# Codebehind将字典从 Ajax 传递到 C# 代码隐藏
【发布时间】:2014-01-01 13:30:51
【问题描述】:

我正在使用 ASP.Net 和 jquery/ajax

我在 jquery 中有以下脚本:

var sizes = [];
sizes.push({ key: "1", value: "3"});
$.ajax({
    type: "POST",
    url: pageUrl,
    data: '{"sizeList":' + sizes + '}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) {
        alert("success");
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert("Status: " + textStatus); alert("Error: " + errorThrown);
    }
}

这是代码隐藏:

public static void AddProductToDB(Dictionary<String, String> sizeList)

谁能告诉我我做错了什么,因为我已经尝试了我能想到的一切。 谢谢

【问题讨论】:

  • 您到底遇到了什么问题?您遇到什么错误等?
  • 我收到 500 Internal Server Error,但它仍然没有进入 codebehind 的方法,而且该方法现在是空的 谢谢
  • 我猜你还有其他 ajax 帖子在工作吗?
  • 是的,当我尝试传递简单变量(例如字符串整数甚至数组)时,它们都可以工作
  • 根据字典的 mvc 模型绑定 [请查看此内容。][1] [1]:stackoverflow.com/questions/6858061/…

标签: c# jquery asp.net ajax


【解决方案1】:
var param = {
    '[0].Key': '1', 
    '[0].Value': '3'
};

$.ajax({
    type: "POST",
    url: pageUrl,
    data: param 
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (msg) {
        alert("success");
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert("Status: " + textStatus); alert("Error: " + errorThrown);
    }
}

【讨论】:

  • 我尝试过这种方式,但它仍然给了我同样的错误。谢谢
【解决方案2】:

我在这篇文章发布两年后才看到它,但希望如果有人偶然发现这篇文章,它会对他们有所帮助。我使用 Damith 的答案的基础来形成我要传递的参数,并通过以下方式传递它们来使其工作:

var param = {
    'filters[0].Key': '1',
    'filters[0].Value': 'test',
    'filters[1].Key': '2',
    'filters[1].Value': 'test',
    id: 1,
    width: 150,
    height: 150,
};

然后在 MVC 代码上,我的方法具有以下签名:

public async Task<ActionResult> IndexPartial(int id = -1, int? width = null, int? height = null, Dictionary<string, string> filters = null)

通过这两件事,我能够让该方法检测作为Dictionary&lt;string,string&gt; 传递的信息,同时我能够传递其他参数。希望这能解决您的问题。

【讨论】:

    【解决方案3】:

    看起来您正在尝试使用页面方法。如果是这样,您需要使用 WebMethod 属性来装饰您的方法(在代码中)

    [WebMethod]
    public static void AddProductToDb(Dictionary <string, string> sizelist){}
    

    然后确保将带有 jquery 的 json 对象发布到正确的 url...例如...PageName.aspx/AddProductToDb

    如果您使用页面方法,这就是您所需要的一切

    【讨论】:

    • 您好,我的方法已经具有该规范,因为其他 ajax 方法正在工作,问题是当我尝试将字典作为参数传递时
    • 知道了。您正在发送一个具有属性 (sizelist) 的对象,该属性是一个数组,但是 page 方法需要一个字典。您需要做的是在您的代码中创建一个对象,该对象具有一个名为 sizelist 的属性,该属性是一个字符串数组。然后用 DataContract 属性和 DataMember 属性装饰这个对象。那应该做的工作
    【解决方案4】:

    我相信您需要将传统设置为 true,以便正确序列化

    $.ajax({
        type: "POST",
        url: pageUrl,
        traditional: true,
        data: '{"sizeList":' + sizes + '}',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (msg) {
            alert("success");
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("Status: " + textStatus); alert("Error: " + errorThrown);
       }
    }
    

    【讨论】:

      【解决方案5】:

      请参考以下代码。确保您的方法 "AddProductToDB" 具有 HttpPost 属性和 相同/相同 在这种情况下为参数的名称 "sizeList"强>。

      C#/MVC/后端:

      [HttpPost]
      public static void AddProductToDB(Dictionary<String, String> sizeList)
      {
      
          //Business logic or Data
      
      }
      

      Javascript / jQuery / 客户端:

      然后输入您使用此函数/方法 AddProductToDB 的 URL

      例如“YourController/AddProductToDB”。

      <script type="text/javascript">
      
          var sizes = [];
          sizes.push({ "Key": "key1", "Value": "value1" });
          sizes.push({ "Key": "key2", "Value": "value2" });
          sizes.push({ "Key": "key3", "Value": "value3" });
          $.ajax({
              type: "POST",
              url: '/YourController/AddProductToDB',
              data: JSON.stringify({
                  sizeList: sizes
              }),
              contentType: "application/json; charset=utf-8",
              dataType: "json",
              success: function (msg) {
              alert("success");
              },
              error: function (XMLHttpRequest, textStatus, errorThrown) {
                  alert("Status: " + textStatus); alert("Error: " + errorThrown);
              }
          });
      
      </script>
      

      【讨论】:

        【解决方案6】:

        你可以用这个:

        var param = {
            '1': '3'
        };
        
        $.ajax({
            type: "POST",
            url: pageUrl,
            data: JSON.stringify({sizeList: param}),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                alert("success");
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
               alert("Status: " + textStatus);
            }
        }
        

        然后你可以用这个从字典变量中读取它:

         public static void AddProductToDB(Dictionary<String, String> sizeList) {
             sizeList["1"]; // return "3"
         }
        

        【讨论】:

        • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 1970-01-01
        相关资源
        最近更新 更多