【问题标题】:Passing variables from Javascript to C# via forms?通过表单将变量从 Javascript 传递到 C#?
【发布时间】:2011-11-08 00:52:16
【问题描述】:

我有一个存储在<input type="hidden"> 中的数组。这是我的代码。

Javascript:

var trees;

// called when the body loads
function BodyOnLoad()
{
  trees = document.getElementById("trees");
  trees.value = new Array();
}

// this is what isn't working
function AddTree()
{
  var i = trees.value.length;

  trees.value[i] = new Array();
  /***/
  trees.value[i]["branches"] = 5;
  trees.value[i]["trunk"]    = 0;
}

HTML:<input type="hidden" name="trees" id="trees" />

在 C# 中,Request.Form["trees"] 不是数组。我做错了什么?

【问题讨论】:

    标签: c# javascript arrays forms


    【解决方案1】:

    HTML 表单帖子不会保留 javascript 对象(在本例中为数组)。如果您需要保留数组对象,您应该考虑将您的 Array 转换为 JSON 并在表单中传递 that

    在您的页面中包含此脚本 (JSON2): JSON2

    var treesArray;
    
    // called when the body loads
    function BodyOnLoad()
    {
      treesArray = new Array();
    }
    
    function AddTree()
    {
      var tree = new Array();
    
      //branches      
      tree[0] = "5";
    
      //trunk      
      tree[1] = "0";
    
      //name
      tree[2] = "Elm";
    
      treesArray[treesArray.length] = tree;
      document.getElementById("trees").value = JSON.stringify(treesArray);
    }
    

    然后在服务器端,您需要使用以下方式将 JSON 转换为 C# 数组:

    从 System.Web.Extensions.dll (.NET 3.5 SP1) 添加对 JavaScriptSerializer 的引用

    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string[][] trees = serializer.Deserialize<string[][]>(Request.Form["trees"]);
    
    for(int i = 0; i < trees.Length; i++)
    {
        Console.WriteLine("Branches:" + trees[i][0]);
        Console.WriteLine("Trunk:" + trees[i][1]);
        Console.WriteLine("Name:" + trees[i][2]);
    }
    

    【讨论】:

    • JSON.stringify 在 IE 中不可用...不是这种形式。最好使用 javascript 库来执行此操作,例如 jQuery。 (编辑 - 我的坏 jQuery 不支持这个......看看stackoverflow.com/questions/191881/… 了解如何序列化 json)
    • 正如我在答案中指出的,您必须为 JSON.stringify() 包含脚本 JSON2.js。我相信你无论如何都必须使用这个脚本,即使在使用 jQuery 时,为了序列化 JavaScript 对象。
    • 谢谢,我最终使用了 JSON。对以上所有三个答案 +1,但接受了这个答案,因为它提供了最多的例子。
    • 对于任何关心的人,我使用了JSON plugin for jQuery
    【解决方案2】:

    您不能在 javascript 中将输入元素的值设置为数组。

    您只能将字符串设置为输入元素的值。

    如果要向服务器发送多个值,则必须连接多个字符串,并使用分隔符,如管道“|”或逗号 ','... 然后在服务器上,您需要使用该分隔符拆分字符串。

    【讨论】:

    • Miguel 的建议是正确的,如果您想要一个原生 C# 数组并避免自己解析,您也可以将 JSON 格式的字符串传递并使用 Javascriptserialiser 类将其反序列化为数组。
    • 感谢您的回复。不幸的是,这有点复杂,因为我需要传入一个数组数组。我还应该这样做吗?
    • 将您的数组序列化为 JSON 字符串。
    【解决方案3】:

    您需要用 [] 命名隐藏的表单元素(例如,trees[])。然后,当您希望向数组添加新值时,将另一个 DOM 元素附加到表单,即具有相同名称(和新值)的隐藏输入类型。

    发布后,我相信您将能够在 C# 中以逗号分隔值字符串的形式访问它们。

    【讨论】:

    • 不。事实上,它是一个null 变量。
    • 请确保您的表单方法=POST,否则 Request.Form[anything] 可能为空。
    【解决方案4】:

    您可以从输入中读取值,对其进行评估,当您发布表单时,将变量字符串化并将其写入输入(JSON.stringify 和 eval 函数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 2011-07-14
      • 2017-01-17
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多