16 Stimmen

Wie übergeben Sie Sonderzeichen, so dass ASP.NET MVC korrekt Abfragezeichenfolge Daten verarbeiten kann?

Ich benutze eine Route wie diese:

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

Es gibt eine Aktion, die diesen Weg übernimmt:

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

Wenn ich anrufe return RedirectToAction("NewInvoice", "Customer", new {name}); und name gleich "The C# Guy" ist, wird der Parameter "name" auf "The C" gekürzt.

Meine Frage lautet also: Was ist der beste Weg, um diese Art von Sonderzeichen mit ASP.NET MVC zu behandeln?

Danke!

16voto

Haacked Punkte 56079

Ok, ich habe bestätigt, dass es sich um jetzt ein bekanntes Problem in ASP.NET Routing, leider. Das Problem besteht darin, dass wir tief in den Eingeweiden des Routings Uri.EscapeString verwenden, wenn wir Routing-Parameter für den Uri escapen. Bei dieser Methode wird jedoch das Zeichen "#" nicht umgangen.

Beachten Sie, dass das Zeichen # (auch bekannt als Octothorpe) technisch gesehen das falsche Zeichen ist. C die Sprache ist eigentlich ein "C" gefolgt von einem Sharp-Zeichen wie in der Musik: http://en.wikipedia.org/wiki/Sharp_(Musik)

Wenn Sie das scharfe Zeichen verwenden würden, könnte dieses Problem möglicherweise gelöst werden :P

Eine andere Lösung, da die meisten Leute den Octothorpe verwenden möchten, besteht darin, eine benutzerdefinierte Route für diese Route zu schreiben und nach dem Abrufen des virtuellen Pfads das #-Zeichen mit HttpUtility.UrlEncode zu kodieren, das # in %23 kodiert.

Im Anschluss daran möchte ich Sie auf diesen Blogbeitrag hinweisen, in dem es um die Einfügung anderer "ungültiger" Zeichen geht. http://haacked.com/archive/2010/04/29/allowing-reserved-filenames-in-URLs.aspx

0 Stimmen

Danke Phil, dass du dir die Zeit genommen hast, dieses Problem zu untersuchen

3voto

EndangeredMassa Punkte 16782

URL-Kodierung! Ändern Sie den Link so, dass er Sonderzeichen kodiert.

Server.URLencode(strURL)

C# wird zu "c%23".

3voto

Haacked Punkte 56079

Funktioniert auf meinem Rechner. Hier ist, was ich getan habe, um das einfachste mögliche Beispiel zu erstellen.

//Global.asax.cs

using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication4 {
  public class MvcApplication : System.Web.HttpApplication {
    public static void RegisterRoutes(RouteCollection routes) {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
        "Default",                        // Route name
        "{controller}/{action}/{id}",               // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
      );

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

    protected void Application_Start() {
      RegisterRoutes(RouteTable.Routes);
    }
  }
}

//HomeController.cs
using System.Web.Mvc;

namespace MvcApplication4.Controllers {
  [HandleError]
  public class HomeController : Controller {
    public ActionResult Index() {
      return RedirectToAction("NewInvoice", "Customer", new { name = "The C# Guy" });
    }
  }
}

//CustomerController.cs
using System.Web.Mvc;

namespace MvcApplication4.Controllers {
    public class CustomerController : Controller {
        public string NewInvoice(string name) {
            return name;
        }
    }
}

Dann habe ich meine Anwendung gestartet und zu /home/index navigiert. Die Umleitung erfolgt und ich sah "The C# Guy" in meinem Browser.

0 Stimmen

Wird er auf Rechnung/Neu/Kunde/Neu/Der+C%2523+Guy oder auf Kunde/NeueRechnung?name=Der%2BC%2523%2BGuy umgeleitet?

0 Stimmen

Ah, ich verstehe. Ich werde es mir ansehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X