文字列の配列をasp.netを使用してWebフォームの非表示フィールドに保存する必要があります。誰か私にそれを達成する方法を教えてもらえますか?ありがとう
おそらくいくつかの方法がうまくいくでしょう。
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()
を使用して、最初に各文字列をエスケープすることができます。
配列を保存するには
string[] myarray = new string[] {"1","2"};
myHiddenField.Value = String.Join(",", myarray);
配列を取得するには
string[] myarray = myHiddenField.Value.Split(',');
実際に単一のフィールドに格納しますか?
各値を独自の非表示フィールドに入れ、すべての非表示フィールドにプロパティの名前を指定すると、モデルバインディングはこれを配列として扱います。
foreach (var option in Model.LookOptions)
{
@Html.Hidden(Html.NameFor(model => model.LookOptions).ToString(), option)
}
私は常にデフォルトのプロパティとモデルバインダーを使用したいのですが、配列を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変数を手動で指定する方法です。
HiddenFor()
を使用できません。プロパティ名に値Hidden()
実際には2倍になり、プロパティ名は途中でバインドできなくなります。