在HiddenField asp.net中存储字符串数组

时间:2012-12-13 23:42:12

标签: asp.net hidden-field

我需要使用asp.net在我的网络表单中的隐藏字段中存储一个字符串数组。请问有谁可以告诉我如何实现这一目标?感谢

4 个答案:

答案 0 :(得分:14)

可能有一些方法可行。

1)在JSON中序列化String []

使用JavaScriptSerializer类在.NET中相当容易,并避免使用分隔符字符。类似的东西:

String[] myValues = new String[] { "Red", "Blue", "Green" };
string json = new JavaScriptSerializer().Serialize(myValues);

2)想出一个永远不会出现在字符串中的分隔符

使用|||之类的字符分隔每个字符串,该字符将永远不会出现在字符串中。您可以使用String.Join()来构建此字符串。类似的东西:

String[] myValues = new String[] { "Red", "Blue", "Green" };
string str = String.Join("|||", myValues);

然后重建它:

myValues = str.Split(new string[] { "|||" }, StringSplitOptions.RemoveEmptyEntries);

如果您可以信任您的输入,这可能是最佳选择,例如一系列预定义的选择。否则,您可能希望检查您的输入字符串,以确保它们不包含此分隔符,如果您想要非常安全的话。您可以先使用HttpUtility.HtmlEncode()来转义每个字符串。

答案 1 :(得分:7)

存储数组

string[] myarray = new string[] {"1","2"};

myHiddenField.Value = String.Join(",", myarray);

获取数组

string[] myarray = myHiddenField.Value.Split(',');

答案 2 :(得分:5)

你真的想把它存放在一个字段中吗?

如果您将每个值放入其自己的隐藏字段中,并为所有隐藏字段提供属性的名称,那么模型绑定会将其视为数组。

destination

答案 3 :(得分:0)

现有答案

我总是宁愿使用默认属性和模型绑定器而不是必须将数组包装成CSV并且不得不担心拆分它并在每次往返客户端的时候加入它(如{{ 3}}和@Mike Christensen)。这正是模型装订器的用途。

@codingbiz指出了我们正确的方向,但我宁愿不将这种逻辑内联到您的视图中,而是将其转换为EditorTemplate。

首选解决方案

因此,您可以添加以下视图~/Views/Shared/EditorTemplates/HiddenArray.cshtml

@model Array

@foreach (var value in Model)
{
    <input type="hidden" value="@value"
           name="@Html.NameFor(model => model)"
           id="@(Html.IdFor(model => model))_@value" />
}

然后从你的模型中这样调用:

@Html.EditorFor(model => model.FavoriteAnimals, "HiddenArray")

替代策略

以下是我为每个隐藏输入手动指定名称和id变量的方法:

@David's answer

  • A)无法在循环中使用Hidden For Array,因为它认为属性名称现在包含值
  • B)当我们调用EditorFor时,当前模型会添加到Route Prefix中,因此如果我们将当前模型名称作为字符串传递给HiddenFor(),我们实际上会加倍并且在返回途中属性名称将无法绑定。
  • C)感觉很奇怪,但我们可以只传递一个空字符串作为名称并依赖Route Prefix来完成它的工作,但因为我们在一个循环中,所以ID是生成的无效HTML
  • D)通过从模型中获取名称和ID并递增虚拟ID,我们可以继续输出有效的HTML,即使它可能不会影响除html linters和audits之外的任何内容/ LI>

进一步阅读: