2008-12-17 7 views
15

J'utilise un itinéraire comme celui-ci:Comment passer des caractères spéciaux afin qu'ASP.NET MVC puisse gérer correctement les données de chaîne de requête?

routes.MapRoute("Invoice-New-NewCustomer", 
    "Invoice/New/Customer/New/{*name}", 
    new { controller = "Customer", action = "NewInvoice" }, 
    new { name = @"[^\.]*" }); 

Il y a une action qui gère cette voie:

public ActionResult NewInvoice(string name) 
{ 
    AddClientSideValidation(); 
    CustomerViewData viewData = GetNewViewData(); 
    viewData.InvoiceId = "0"; 
    viewData.Customer.Name = name; 
    return View("New", viewData); 
} 

Quand j'appelle return RedirectToAction("NewInvoice", "Customer", new {name}); et le nom est égal à « Le C# Guy », la Le paramètre "name" est tronqué à "The C". Donc, ma question est: Quelle est la meilleure façon de gérer ce genre de caractère spécial avec ASP.NET MVC?

Merci!

Répondre

16

Ok, j'ai confirmé que c'est maintenant un problème connu dans le routage ASP.NET, malheureusement. Le problème est que dans les entrailles du routage, nous utilisons Uri.EscapeString lors de l'échappement des paramètres de routage pour l'Uri. Cependant, cette méthode n'échappe pas au caractère "#". Notez que le caractère # (aka Octothorpe) est techniquement le mauvais caractère. C♯ la langue est en fait un "C" suivi d'un signe "Sharp" comme dans la musique: http://en.wikipedia.org/wiki/Sharp_(music)

Si vous utilisez le signe pointu, cela pourrait potentiellement résoudre ce problème. : P

Une autre solution, puisque la plupart des gens voudront utiliser l'octothorpe est d'écrire une route personnalisée pour cette route et après avoir obtenu le chemin virtuel, encoder le signe # en utilisant HttpUtility.UrlEncode qui code # à% 23. En guise de suivi, je voulais vous renvoyer à cet article de blog qui parle de transmettre d'autres caractères «invalides». http://haacked.com/archive/2010/04/29/allowing-reserved-filenames-in-URLs.aspx

+0

Merci Phil d'avoir pris le temps d'enquêter sur ce problème – labilbe

3

Encodage d'URL! Changez le lien pour qu'il code les caractères spéciaux.

Server.URLencode(strURL) 

C# deviendra "c% 23".

3

Fonctionne sur ma machine. Voici ce que j'ai fait pour créer l'exemple le plus simple possible. J'ai ensuite démarré mon application et navigué vers/home/index. La redirection se produit et j'ai vu "Le C# Guy" dans mon navigateur.

+0

est-il allez être redirigé vers facture/Nouveau/client/Nouveau/Le + C% + 2523 Guy ou Client/NewInvoice? Name = Le% 2BC% 2523% 2BGuy ? – labilbe

+0

Ah, je vois. Je vais regarder dedans. – Haacked

Questions connexes