wake-up-neo.com

speichern eines Arrays von Strings in einem HiddenField asp.net

Bei asp.net muss ich ein String-Array in einem ausgeblendeten Feld in meinem Webformular speichern. Kann mir jemand bitte sagen, wie ich das erreichen kann? Vielen Dank

11
user1438482

Wahrscheinlich würden ein paar Methoden funktionieren.

1) Serialize the String [] in JSON

Dies wäre in .NET mit der JavaScriptSerializer-Klasse relativ einfach und vermeidet Probleme mit Trennzeichen. So etwas wie:

String[] myValues = new String[] { "Red", "Blue", "Green" };
string json = new JavaScriptSerializer().Serialize(myValues);

2) Entscheide dich für ein Trennzeichen, das niemals in den Saiten erscheint

Begrenzen Sie jede Zeichenfolge mit einem Zeichen wie |||, das niemals in der Zeichenfolge angezeigt wird. Sie können String.Join() verwenden, um diese Zeichenfolge zu erstellen. So etwas wie:

String[] myValues = new String[] { "Red", "Blue", "Green" };
string str = String.Join("|||", myValues);

Und dann bauen Sie es wie folgt auf:

myValues = str.Split(new string[] { "|||" }, StringSplitOptions.RemoveEmptyEntries);

Dies ist möglicherweise die beste Option, wenn Sie Ihrer Eingabe vertrauen können, beispielsweise einer Reihe von vordefinierten Auswahlmöglichkeiten. Andernfalls möchten Sie wahrscheinlich check Ihre Eingabezeichenfolgen überprüfen, um sicherzustellen, dass sie dieses Trennzeichen nicht enthalten, wenn Sie sehr sicher sein möchten. Sie könnten möglicherweise HttpUtility.HtmlEncode() verwenden, um zuerst jede Zeichenfolge zu umgehen.

13

Um das Array zu speichern

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

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

Um das Array zu erhalten

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

Möchten Sie es tatsächlich in einem einzigen Feld speichern?

Wenn Sie jeden Wert in ein eigenes ausgeblendetes Feld einfügen und allen ausgeblendeten Feldern den Namen Ihrer Eigenschaft zuweisen, wird die Modellbindung dies als Array behandeln.

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

Bestehende Antworten

Ich würde immer lieber den Standardeigenschafts- und Modellbinder verwenden, als ein Array in eine CSV zu packen und sich Gedanken darüber zu machen, ob es aufgeteilt und bei jedem einzelnen Rundgang zum Client (wie in den Antworten von @Mike Christensen) eingebunden wird und @codingbiz ). Genau dafür ist der Musterordner vorhanden.

@ Davids Antwort weist uns in die richtige Richtung, aber ich möchte diese Art von Logik nicht in Ihre Ansicht einbinden und sie stattdessen einer EditorTemplate zuordnen. 

Bevorzugte Lösung

Sie können also die folgende Ansicht hinzufügen ~/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))[email protected]" />
}

Dann rufen Sie so von Ihrem Modell aus an:

@Html.EditorFor(model => model.FavoriteAnimals, "HiddenArray")

Alternative Strategien

So bin ich dazu gekommen, den Namen und die ID-Variable für jede versteckte Eingabe manuell anzugeben:

 Hidden For Array

  • A) Kann HiddenFor() nicht innerhalb einer Schleife verwenden, da davon ausgegangen wird, dass der Eigenschaftsname jetzt den Wert enthält 
  • B) Wenn wir EditorFor aufrufen, wird das aktuelle Modell zum Routenpräfix hinzugefügt. Wenn wir also den aktuellen Modellnamen als Zeichenfolge an Hidden() übergeben, verdoppeln wir den Eigenschaftsnamen kann nicht auf dem Rückweg binden. 
  • C) Es fühlt sich seltsam an, aber wir können einfach eine leere Zeichenkette als Namen übergeben und uns auf das Routenpräfix verlassen, aber da wir uns in einer Schleife befinden, ist die erzeugte ID nicht ' t gültiges HTML 
  • D) Durch Abrufen des Namens und der ID aus dem Modell und Erhöhen der Dummy-ID können wir weiterhin gültiges HTML ausgeben, auch wenn dies wahrscheinlich keine Auswirkungen auf HTML-Linters und Audits hat

Weiterführende Literatur:

0
KyleMit