【问题标题】:storing an array of strings in a HiddenField asp.net在 HiddenField asp.net 中存储字符串数组
【发布时间】:2012-12-01 23:20:39
【问题描述】:

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

【问题讨论】:

    标签: asp.net hidden-field


    【解决方案1】:

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

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

    【讨论】:

    • 由于 HiddenField 只能保存与 Array 不同类型的字符串数据。要存储数组,我们需要将数组序列化为字符串。 Array 采用哪种方式序列化,视场景而定。
    • 我认为如果您显示值如何存储在隐藏字段中,答案会更好。另外,作为我,我认为每个寻找这个答案的人也希望看到相反的方式:new JavaScriptSerializer().Deserialize<List<string>>(str)。无论如何,谢谢 :) ...JavaScriptSerializer 解决了我的问题 +1
    【解决方案2】:

    存储数组

    string[] myarray = new string[] {"1","2"};
    
    myHiddenField.Value = String.Join(",", myarray);
    

    获取数组

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

    【讨论】:

    • 如果myarray 中的元素实际上包含一个逗号,这当然是有问题的。
    • 确实如此。之前遇到过这个问题。必须更改为另一个不会出现在字符串中的字符,这也不能保证
    【解决方案3】:

    您真的想将其存储在单个字段中吗?

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

    foreach (var option in Model.LookOptions)
    {
        @Html.Hidden(Html.NameFor(model => model.LookOptions).ToString(), option)
    }
    

    【讨论】:

      【解决方案4】:

      现有答案

      我总是宁愿使用默认属性和模型绑定器,而不是必须将数组包装到 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 变量的方法:

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

      延伸阅读:

      【讨论】:

        猜你喜欢
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 2016-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多