2009-03-20 13 views
4

Dans mon asp.net demande mvc J'ai créé le lien suivant:Quel est le problème avec mon encodage d'URL?

http://localhost:2689/en/Formula.mvc/351702++LYS+GRONN+5G+9%252f2++fds 

Je reçois une erreur 400 (mauvaise demande). Je pense qu'il bloque au% 25 (barre oblique).
Qu'est-ce que je fais de mal?

--edit 3--
J'ai essayé pas coder quoi que ce soit, mais plutôt compter sur l'encodage par défaut de Url.RouteUrl().
Il semble que cela n'encode pas le "/" pour une raison quelconque.
Si je l'encode moi-même en premier, je me retrouve avec le codage en doute% 252f. Cela me donne une mauvaise demande pour une raison quelconque. Pourquoi ?!

--edit 2--
I généré la dernière partie de l'URI comme suit:

  1. Prenez le id.toString
  2. Prenez le HttpUtility.UrlEncode (nom)
  3. Prenez le HttpUtility.UrlEncode (code)
  4. String.Format ("{0} - {1} - {2}") avec les valeurs des pièces précédentes
  5. Ajoutez-le comme un paramètre à Url.RouteUrl()

Ensuite, mon action récupère ce paramètre, le divise en - et HttpUtility.Decode() les valeurs en retour.

Je le fais de cette façon parce que les deux derniers paramètres sont facultatifs, mais les paramètres fonctionnels. S'ils sont définis dans une étape précédente, ils doivent être reportés sur les autres pages.
Moins abstrait: Une couleur peut avoir plusieurs noms, mais si un utilisateur l'a sélectionné par un nom particulier, il doit être conservé dans toutes les autres pages.

--edit 1--
Il ressemble également à HttpUtility.UrlEncode() et Url.Encode() renvoient des résultats différents: S

Si je ne code pas pour le "/", il agit comme un séparateur => pas de chance là-bas. Si j'encoder avec Url.Encode() je me retrouve avec 2F% => Code de 400 Si j'encoder avec HttpUtility.UrlEncode() je me retrouve avec 25% => Code 400

Parce que 400 doesn » laissez même pas jusqu'à asp.net-mvc, le débogueur de route est d'aucune utilité :(

+0

Qu'est-ce que cela signifie représenter? Devrait-il être 351702 ++ LYS + GRONN + 5G + 9% 2f2f2 ++ fds –

+0

Il devrait être 351702 ++ LYS GRONN 5G 9/2 ++ fds –

Répondre

3

J'y étais il y a quelques jours. Si vous pouvez accepter des valeurs de route illisibles dans l'URL, essayez ceci: URL-encoded slash in URL

+1

J'ai fini par faire quelque chose de similaire, seulement j'ai échangé les valeurs incontournables aux mots. Par exemple: "-slash-". Pas ce que j'appelle parfait, mais c'est le meilleur que je puisse trouver pour le moment. –

0

Je ne l'ai pas regardé trop à l'encodage - mais note que si cela doit être stocké quelque part (ou agi d'une certaine façon), alors un POST serait plus approprié Si le texte à droite est réellement représentatif des données avec l'ID 351702 (une url de vanity, un peu comme /665354/whats-wrong-with-my-url-encoding), alors vous devriez humaniser le texte. Tout comme les espaces ont été retirés de ce qui précède. Il est également courant d'avoir ceci comme un niveau séparé dans la route qui est simplement jetée.

Généralement, les URL MVC doivent être compréhensibles.

+0

Cette partie de l'URL définit d'abord l'identifiant d'une couleur. Ensuite, les deux parties suivantes sont facultatives pour définir le nom et le code préférés. Il doit être envoyé tout au long de l'application. Je vise à être RESTfull, pas à rendre l'URL une interface humaine. Ce qui est une idée stupide à mon avis. –

+0

En outre, il n'y a pas de stockage impliqué. Je suis au courant des dangers de faire des changements de données disponibles à travers. –

+0

Je reçois maintenant ce que vous voulez dire en gardant l'ID appart de la description. Dans mon cas, la description n'est pas seulement pour le référencement. Il a un but fonctionnel. En raison du fonctionnement de ma base de données source (je ne peux pas la modifier), la description est la clé de quelque chose. –

1

%25 est en fait codé "%", donc %252f est codé "% 2f".

%2f (codé "/") n'est pas autorisé dans l'URL sauf si vous l'autorisez explicitement dans la configuration du serveur Web.

0

Vous ne pouvez pas utiliser une barre oblique comme valeur dans l'URL. Voici un beau message sur la création navigateur et SEO friendly URLS =>http://www.dominicpettifer.co.uk/displayBlog.aspx?id=34

[Modifier] Chaque fois que vous créez un itinéraire vous associer à un modèle d'URL (Le modèle par défaut est {contrôleur}/{action}/{id }). Et dans ce modèle d'URL, vous devez utiliser la barre oblique pour séparer les différents jetons. Hope qui aide

+0

Alors, quelle est l'alternative alors? Et pourquoi l'encodage d'URL n'attrape-t-il pas cela? –

+0

Oui, vous pouvez. C'est seulement la configuration par défaut, qui ne le permet pas. – vartec

+0

Chaque fois que vous créez une route, vous l'associez à un modèle d'URL (le modèle par défaut est {controller}/{action}/{id}). Et dans ce modèle d'URL, vous êtes censé utiliser la barre oblique pour séparer les différents jetons. J'espère que cela pourra aider. –

Questions connexes