我需要使用asp.net在我的网络表单中的隐藏字段中存储一个字符串数组。请问有谁可以告诉我如何实现这一目标?感谢
答案 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变量的方法:
HiddenFor()
,我们实际上会加倍并且在返回途中属性名称将无法绑定。