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

Posted

技术标签:

【中文标题】通过表单将变量从 Javascript 传递到 C#?【英文标题】:Passing variables from Javascript to C# via forms? 【发布时间】: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"] 不是数组。我做错了什么?

【问题讨论】:

【参考方案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

将MS Access表单日期传递到Oracle SQL

Qt:通过类 C 将变量从 ClassA 传递到 ClassB

将变量从访问表单传递到访问表单