18

我需要使用 asp.net 在我的网络表单中的 HiddenField 中存储一个字符串数组。谁能告诉我如何实现这一目标?谢谢

4

4 回答 4

16

可能有几种方法会起作用。

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()先使用转义每个字符串。

于 2012-12-13T23:48:36.543 回答
9

存储数组

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

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

获取数组

string[] myarray = myHiddenField.Value.Split(',');
于 2012-12-13T23:48:48.797 回答
7

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

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

foreach (var option in Model.LookOptions)
{
    @Html.Hidden(Html.NameFor(model => model.LookOptions).ToString(), option)
}
于 2015-11-25T16:03:28.420 回答
2

现有答案

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

@David 的回答为我们指明了正确的方向,但我宁愿不要将这种类型的逻辑内联到您的视图中,而是将其降级为 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 变量:

为数组隐藏

  • A) Can't use HiddenFor() inside a loop because it thinks the property name now includes the value
  • B) When we call EditorFor, the current model is added to the Route Prefix so if we pass the current model name as a string to to Hidden() we'll actually double up and the property name won't be able to bind on the way back.
  • C) It feels odd, but we can just pass an empty string as the name and rely on the Route Prefix to do its job, but because we're inside a loop, the ID that gets produced isn't valid HTML
  • D) By grabbing the name and ID from the model and incrementing the dummy ID, we can continue to output valid HTML, even though it's probably not likely to affect anything but html linters and audits

Further Reading:

于 2018-03-14T23:56:38.330 回答