2012-12-14 9 views
9

Ich habe ein Array von Zeichenfolgen, die ich in einer Abfragezeichenfolge von Url.Action übergeben muss.URL.Action mit einem String-Array?

Url.Action("Index", "Resource", new { FormatIds = Model.FormatIDs}) 

Im Moment wird der Link in meinem Browser als System.String [] statt einer Abfragezeichenfolge angezeigt. Ist es möglich, MVC dies automatisch mit Modellbindung zu tun?

ich es brauche mit meinem Controller-Aktion zu binden, wie:

public ActionResult Index(string[] formatIDs) 
+1

Wie soll die Ausgabe aussehen? –

+0

Ich brauche es mit meiner Controller-Aktion zu binden, die wie folgt aussieht: öffentlichen ActionResult Index (string [] formatIDs) – user547794

+0

eine Abfragezeichenfolge ist im Allgemeinen nicht der beste Weg, dies zu tun. –

Antwort

7

Um die Liste der Zeichenfolge zu erhalten automatisch zu binden, um die Standardbinder verwenden, müssen Sie sie als bieten:

name=value&name=value2&name=value3 

So müssen Sie Ihre Liste so etwas wie konvertieren:

Index?formatIDs=1&formatIDs=2&formatIDs=3 
+0

+1 für das Standardmodell Bindemittel, das ist die richtige Anwsser. Sehr schöne Queti. –

+8

Dies beantwortet die Frage nicht. Er möchte, dass Url.Action einen Array-Routenwert korrekt an den Querystring ausgibt. Er fragt nicht, wie man einen solchen Wert bindet. – Sam

6

Für die Verwendung der Standardbinder Modell,

Index?formatIDs=value1&formatIDs=value2&formatIDs=value3 

können Sie gibt eine private Sammlung namens HttpValueCollection auch die Dokumentation sagt, es ist ein Namevaluecollection mit dem ParseQueryString Nutzen: Sie sollten mit so etwas wie am Ende. Dann fügen Sie die Schlüssel manuell, HttpValueCollection die Codierung für Sie. Und dann hängen Sie einfach die Abfrage-Zeichenfolge manuell:

var qs = HttpUtility.ParseQueryString(""); 
new string[] { "value1", "value2", "value3" }.ToList().ForEach(x => qs.Add("formatIDs", x)); 

Url.Action("Index", "Resource")[email protected] 
+0

Ihr Vorschlag funktioniert. Aber ich frage mich, warum es immer noch so seltsam und komplex ist, eine Reihe von Saiten von einer Rasierer-Ansicht zu einer MVC-Controller-Aktion zu senden. – Sven

+0

Da normalerweise sollten Sie ein Formular HTML-Element mit Get-Verb verwenden und alles wird glatt und einfach sein. –

0

Es gibt einen anderen Weg, um die Routevaluedictionary mit einem Array mit:

@{ 
    var parameters = new RouteValueDictionary(); 

    for (var i = 0; i < Model.CustomList.Count; ++i) 
    { 
     parameters.Add($"customListId[{i}]", Model.CustomList[i]); 
    } 
} 

Nutzung:

var url = '@Html.Raw(Url.Action("ControllerActioon", "Controller", parameters))'; 

Immer noch nicht sehr elegant - aber die Arbeit .

Verwandte Themen