web-dev-qa-db-ja.com

文字列の配列をHiddenField asp.netに格納する

文字列の配列をasp.netを使用してWebフォームの非表示フィールドに保存する必要があります。誰か私にそれを達成する方法を教えてもらえますか?ありがとう

15
user1438482

おそらくいくつかの方法がうまくいくでしょう。

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);
_

これは、一連の事前定義された選択肢など、入力を信頼できる場合に最適なオプションです。それ以外の場合、非常に安全にしたい場合は、入力文字列をcheckして、これらの区切り文字が含まれていないことを確認することをお勧めします。 HttpUtility.HtmlEncode()を使用して、最初に各文字列をエスケープすることができます。

14

配列を保存するには

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

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

配列を取得するには

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

実際に単一のフィールドに格納しますか?

各値を独自の非表示フィールドに入れ、すべての非表示フィールドにプロパティの名前を指定すると、モデルバインディングはこれを配列として扱います。

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

既存の回答

私は常にデフォルトのプロパティとモデルバインダーを使用したいのですが、配列をCSVにラップし、クライアントへのラウンドトリップごとに分割して結合することを心配する必要はありません(回答 @ Mike Christensen および @ 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変数を手動で指定する方法です。

Hidden For Array

  • A)ループ内では HiddenFor() を使用できません。プロパティ名に値
  • B)EditorForを呼び出すと、現在のモデルがルートプレフィックスに追加されるため、現在のモデル名を文字列としてに渡した場合 Hidden() 実際には2倍になり、プロパティ名は途中でバインドできなくなります。
  • C)奇妙に感じますが、名前として空の文字列を渡し、ルートプレフィックスに依存してその仕事を行うことができます。ループの内側に戻ると、生成されるIDは有効なHTMLではありません
  • D)モデルから名前とIDを取得し、ダミーIDをインクリメントすることで、有効なHTMLを出力し続けることができます。 html linterと監査以外に影響を与える

参考文献:

0
KyleMit