通过表单将变量从 Javascript 传递到 C#?
Posted
技术标签:
【中文标题】通过表单将变量从 Javascript 传递到 C#?【英文标题】:Passing variables from Javascript to C# via forms? 【发布时间】:2011-11-08 00:52:16 【问题描述】:我有一个存储在<input type="hidden">
中的数组。这是我的代码。
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"]
不是数组。我做错了什么?
【问题讨论】:
【参考方案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 不支持这个......看看***.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 函数)。
【讨论】:
以上是关于通过表单将变量从 Javascript 传递到 C#?的主要内容,如果未能解决你的问题,请参考以下文章
如何将变量从外部 JavaScript 传递到 HTML 表单
通过 POST 将 JSON 编码的变量从 PHP 传递到 Javascript
将变量从 WordPress PHP 传递到 JavaScript