Comment encoder les paramètres dans l'ASP .NET MVC
J'ai le code suivant dans mon point de vue:
<%= Html.ActionLink(
"View item",
"Index",
"Items",
new
{
itemName = Model.ItemName
},
null) %>
J'ai un problème lorsque le nom de l'élément contient un dièse (#) ou le symbole de pourcentage (%).
-
Lorsque le nom de l'élément est
"name#with#sharp#"
, le contrôleur ne reçoit que la première partie du nom jusqu'à la première sharp (uniquement reçoit"name"
). -
Lorsque le nom de l'élément est
"name%with%percent"
j'obtiens une erreur: erreur HTTP 400 - Bad request.
Je ne sais pas si c'est un problème avec l'encodage d'URL, parce qu'il fonctionne avec d'autres conflictuelle de caractères tels que:
;
=
+
,
~
[blank]
Savez-vous comment pourrais-je résoudre ce problème?
Merci d'avance.
Quel url arriver généré? Quand j'essaie votre exemple ci-dessus avec les symboles"%", j'obtiens ceci:
http://localhost/AspNetMvc2/Items?itemName=name%25with%25percent
, et aucune erreur. Aussi, l'exemple de la #
symbole de ce produit: http://localhost:55386/Items?itemName=name%23with%23sharp%23
OriginalL'auteur Daniel Peñalba | 2011-05-05
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que vous avez une configuration de l'itinéraire et de votre url ressemble à quelque chose comme ceci:
http://localhost/Items/Index/name%25with%25percent (blow up)
contrairement à ce:
http://localhost/Items/Index/?itemName=name%25with%25percent - (chaîne de requête est ok)
Donc une option serait de retirer le "itemName" de la propriété à partir de votre itinéraire (dans votre RouteCollection), de sorte que Html.ActionLink rendra l'Url en utilisant le nom de l'élément en tant que paramètre QueryString.
@Priyank dit, le problème est que le nom de l'élément est la partie de l'Url (pas un paramètre QueryString) et elle contient des caractères illégaux.
OriginalL'auteur Lee Gunn
Depuis ces routedvalues sont affichés en tant que partie de l'URL de la chaîne, ils seront traités comme des valeurs distinctes, séparées par le caractère # et %. Il y a deux options pour le traitement de votre dossier.
Vous aurez à mettre en œuvre votre personnalisé
ValueProvider (IValueProvider and especially RouteDataValueProvider)
pour gérer votre besoin. Un programmeur a un problème avec les caractères " /" et il a piraté ici http://mrpmorris.blogspot.com/2012/08/asp-mvc-encoding-route-values.htmlDeuxième est de stocker des valeurs dans TempData qui persiste à travers deux demande et de les utiliser.
Espère que cela aide à penser dans la bonne direction.
OriginalL'auteur Priyank
Vous devriez être en mesure d'utiliser seulement la UrlHelper instance de votre point de vue à le faire pour vous. Essayez de donner un coup de cette:
<%= Html.ActionLink(
"View item",
"Index",
"Items",
new
{
itemName = Url.Encode(Model.ItemName)
},
null) %>
Mise à jour
Après les tests, il semble explicitement l'encodage comme je l'ai fait ci-dessus semble être moins précis et entraîne le serveur à double-encoder (eg - % sortira en %2525 dans l'url).
Sort très bien pour moi si je encoder ou pas. Code d'état 200 à travers le conseil d'administration. Il semble en fait plus précis quand j'ai ne pas coder, et de laisser de routage et IIS faire leur chose normalement. Juste testé dans Casini et IIS Express avec votre url avec des dièses (#), pourcentage (%), et les points positifs (+) des exemples. Quelle est la version de IIS utilisez-vous?
pour reproduire le problème, vous devrez configurer une route avec un jeton appelé itemName - de sorte que l'url ressemble à quelque chose comme: localhost/Articles/Index/nom%25with%25percent - cette url contient des caractères illégaux
Merci pour l'astuce. Semble, dans mes tests, l'url avec des dièses (#) fonctionne toujours très bien w/ route jeton défini. Le pour-cent (%) déclenche asp.net la demande de validation, et les points positifs (+) renvoie une erreur 404. J'ai essayé le fix @Priyank suggéré et qui semblait fonctionner. On dirait qu'il a la réponse. Si j'avais la rep, j'avais upvote lui. 🙂
OriginalL'auteur JasonOffutt