通过表单将变量从Javascript传递到C#?

3
我可以帮您翻译成中文。这段代码是将数组存储在一个隐藏的标签中,以下是代码:

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"]不是一个数组。我做错了什么?


(注:本文中涉及的技术词汇,如有需要请自行查阅相关资料)
4个回答

3
HTML表单提交不会保留JavaScript对象(在本例中,是一个数组)。如果您需要保留数组对象,则应考虑将数组转换为JSON并将其传递到表单中。请注意,在表单中只能传递字符串。因此,您需要使用JSON.stringify()方法将数组转换为字符串。另外,您需要在页面中加入JSON2脚本以确保浏览器兼容性。请将以下脚本(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不支持此功能...请查看https://dev59.com/T3VC5IYBdhLWcg3ww0Hr 了解如何序列化JSON) - Miguel Angelo
正如我在答案中所指出的,您必须包含脚本JSON2.js以使用JSON.stringify()。我认为即使在使用jQuery时,您也必须使用此脚本来序列化JavaScript对象。 - AVH
谢谢,最终我使用了JSON。对上面三个答案点赞,但选择了这个答案,因为它提供了最多的示例。 - user2058002
对于任何关心的人,我使用了jQuery的JSON插件 - user2058002

1

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

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

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


Miguel的建议是正确的,如果你想要一个本地的C#数组并避免自己进行解析,你也可以将字符串以JSON格式传递,并使用Javascriptserialiser类将其反序列化为数组。 - Icarus
谢谢回复。不幸的是,这有点复杂,因为我需要传递一个数组的数组。我还应该这样做吗? - user2058002
1
将您的数组数组序列化为JSON字符串。 - Phill

0

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

在提交后,我相信你可以将它们作为逗号分隔值的字符串在C#中访问。


不是。实际上,它是一个“null”变量。 - user2058002
请确保您的表单方法为POST,否则Request.Form[anything]可能为null。 - AVH

0
你可以从输入中读取值,对其进行eval操作,当你提交表单时,将变量转换为字符串并写入输入框中(使用JSON.stringify和eval函数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接