3 Stimmen

ASP.NET MVC Custom route regex zum Abfangen einer Teilzeichenkette von Elementen und zur Überprüfung ihrer Existenz

Ich versuche, eine benutzerdefinierte Route für URL mit dem folgenden Format zu erstellen:

http://domain/nodes/ {item_1}/{item_2}/{item3_}/..../{item_[n]}

Grundsätzlich könnte es eine zufällige Menge von item_[n] geben, zum Beispiel

http://domain/nodes/1/3/2 

http://domain/nodes/1

http://domain/nodes/1/25/11/45

Mit meiner benutzerdefinierten Route möchte ich ein Array von Elementen abrufen und tun einige Logik (validieren und fügen Sie einige spezifische Informationen zu Anfragekontext) mit ihnen.

Zum Beispiel von [http://domain/nodes/1/25/11/45] möchte ich ein Array von [1, 25, 11, 45] erhalten und es verarbeiten.

Ich habe hier also 2 Probleme.

Die erste Frage ist eigentlich eine Frage. Sehe ich in die richtige Richtung? Oder gibt es vielleicht einen einfacheren Weg, dies zu erreichen (vielleicht ohne benutzerdefinierte Routen)?

Das zweite Problem ist der Abgleich eingehender URLs mit einem Regex-Muster. Kann mir jemand dabei helfen?

Vielen Dank im Voraus :)

1voto

Iridio Punkte 9138

Um Ihr Problem zu lösen, denke ich, dass eine Möglichkeit sein könnte, eine Routing-Klasse zu erstellen und dann die Parameter entsprechend zu behandeln.

  public class CustomRouting : RouteBase
  {
     public override RouteData GetRouteData(HttpContextBase httpContext)
     {
       RouteData result = null;
       var repository = new FakeRouteDB(); //Use you preferred DI injector
       string requestUrl = httpContext.Request.AppRelativeCurrentExecutionFilePath;
       string[] sections = requestUrl.Split('/');
       /*
       from here you work on the array you just created
       you can check every single part
       */
       if (sections.Count() == 2 && sections[1] == "")
         return null; // ~/

       if (sections.Count() > 2) //2 is just an example
       {
         result = new RouteData(this, new MvcRouteHandler());
         result.Values.Add("controller", "Products");
         result.Values.Add("action", "Edit");
         result.Values.Add("itmes0", sections[1]);
         if (sections.Count() >= 3)
         result.Values.Add("item2", sections[2]);
         //....
       }
       else
       {
         //I can prepare a default route        
         result = new RouteData(this, new MvcRouteHandler());
         result.Values.Add("controller", "Home");
         result.Values.Add("action", "Index");
       }
       return result;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
     //I just work with outbound so it's ok here to do nothing
     return null;
    }
}

In der Datei global.asax

public static void RegisterRoutes(RouteCollection routes)
{
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.Add(new CustomRouting());

  routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}

Das sollte Ihnen eine Vorstellung davon geben, was ich denke. Hoffentlich hilft es

0voto

Joanna Derks Punkte 3983

Beim ersten Teil Ihrer Frage kann ich Ihnen nicht helfen, aber ich kann versuchen, die Regex zu erstellen.

In Ihrem Beispiel sind alle Einträge Ziffern - ist das die einzige Möglichkeit? Wenn nicht, geben Sie bitte weitere Informationen über mögliche Zeichen an.

Im Moment würde die Regex lauten:

@"http://domain/nodes(?:/(\d+))*"

(?:) ist eine nicht erfassende Gruppe, () ist eine erfassende Gruppe.
Wenn Sie alle Vorkommen abgleichen, erhalten Sie die Gruppen 1-n , wobei jede Gruppe die übereinstimmende Zahl enthält (Gruppe 0 ist die gesamte Übereinstimmung).

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