【发布时间】:2012-12-01 23:20:39
【问题描述】:
我需要使用 asp.net 在我的网络表单中的 HiddenField 中存储一个字符串数组。谁能告诉我如何实现这一目标?谢谢
【问题讨论】:
标签: asp.net hidden-field
我需要使用 asp.net 在我的网络表单中的 HiddenField 中存储一个字符串数组。谁能告诉我如何实现这一目标?谢谢
【问题讨论】:
标签: asp.net hidden-field
可能有几种方法会起作用。
1) 序列化 JSON 中的 String[]
这在 .NET 中使用 JavaScriptSerializer 类相当容易,并且避免了分隔符问题。比如:
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() 转义每个字符串。
【讨论】:
new JavaScriptSerializer().Deserialize<List<string>>(str)。无论如何,谢谢 :) ...JavaScriptSerializer 解决了我的问题 +1
存储数组
string[] myarray = new string[] {"1","2"};
myHiddenField.Value = String.Join(",", myarray);
获取数组
string[] myarray = myHiddenField.Value.Split(',');
【讨论】:
myarray 中的元素实际上包含一个逗号,这当然是有问题的。
您真的想将其存储在单个字段中吗?
如果您将每个值放在它自己的隐藏字段中,并为所有隐藏字段指定您的属性名称,那么模型绑定会将其视为一个数组。
foreach (var option in Model.LookOptions)
{
@Html.Hidden(Html.NameFor(model => model.LookOptions).ToString(), option)
}
【讨论】:
我总是宁愿使用默认属性和模型绑定器,而不是必须将数组包装到 CSV 中并且不必担心在每次往返客户端时将其拆分并加入它(如 @987654321 的答案@ 和 @codingbiz)。这正是模型绑定器的用途。
@David's answer 为我们指明了正确的方向,但我宁愿不要将这种类型的逻辑内联到您的视图中,而是将其降级为 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(),因为它认为属性名称现在包含值Hidden(),我们实际上会加倍并获得属性名称不能在回来的路上绑定。 【讨论】: