Ce n'est pas une question sur la façon de lier correctement une série de cases à cocher à un modèle property (une question fréquente) - mon site fonctionne parfaitement en lisant les valeurs de checkbox à partir d'une requête, POST ou GET + chaîne de requête.Dans ASP.NET MVC, comment générer des chaînes de requête de nom répété ('? V = 1 & v = 2 & v = 3') avec Html.ActionLink
Il s'agit de savoir comment utiliser Html.ActionLink
pour générer un lien qui formate plusieurs valeurs de case à cocher correctement dans la chaîne de requête.
J'ai donc le modèle suivant:
public class ModelType
{
public string[] V { get; set; }
}
Et je lie, par exemple, 3 cases à cocher pour ce modèle dans la vue que j'ai trois valeurs possibles (et, oui, des combinaisons desdites valeurs).
Voici la finale Html
<INPUT id="chk1" value="1" type="checkbox" name="V">
<INPUT id="chk2" value="2" type="checkbox" name="V">
<INPUT id="chk3" value="3" type="checkbox" name="V">
Si les trois valeurs sont vérifiées lorsque le formulaire est soumis au serveur en tant que GET alors la chaîne de requête générée est, bien sûr, ?V=1&V=2&V=3
.
La reliure de modèle fonctionne magnifiquement, et tout est heureux.
Cependant, disons que je veux produire un lien vers la même action, en passant soit un type anonyme ou RouteValueDictionary
pour produire la même chaîne de requête; états logiques que vous feriez quelque chose comme ceci:
Version 1: Avec une instance de ModelType
comme modèle dans la vue:
<%= Html.ActionLink("Test link", null /* action name */, new { V = Model.V }) %>
Version 2: Initialisation du membre « V » directement sous forme de tableau:
<%= Html.ActionLink("Test link", null /* action name */,
new { V = new string[] { "1", "2", "3" } }) %>
[dans la question que je dis RouteValueDictionary
parce que dans les deux cas, ces deux types anonymes sont transformés en se tels avant lien génération se produit.]
Dans les deux cas, la chaîne de requête produite est la suivante: ?V=System.String%5B%5D
. Maintenant, je comprends que c'est parce que le générateur de lien appelle simplement ToString()
sur le tableau; mais il semblerait qu'il n'y ait aucun moyen de transmettre à MVC une valeur qui l'amènera à générer ?V=1&V=2&V=3
.
Puisque ni la langue nous permet de faire:
new { V="1", V="2", ... }
ne RouteValueDictionary nous permet de faire:
d["V"] = "1"; d["V"] = "2"; ...
J'ai aussi essayé la mesure désespérée de pré-traitement d'une RouteValueDictionary, de sorte que pour chaque IEnumerable<string>
, je produis une seule chaîne avec chaque valeur séparée par une virgule, puis réécrit cette chaîne - de sorte que la chaîne de requête se termine comme ceci: ?V=1%2C2%2C3
.Mais bien sûr, MVC ne lie pas automatiquement une telle chaîne à un tableau (vous obtenez juste une chaîne dans le tableau avec les virgules dedans); donc chaque propriété qui sera liée de cette manière doit être liée à la coutume - ce qui, pour moi, semble juste être un peu trop de cerceaux à franchir.
Donc, il semble que je suis bloqué.
Ai-je raté quelque chose? Aurai-je besoin d'écrire des versions spéciales d'ActionLink qui font ce que je veux?
Toute aide, comme toujours, grandement appréciée.