2012-04-20 10 views
9

sehr einfache Frage, aber ich konnte keine Antwort auf diese finden:ASP .NET MVC Routing: Url nur mit String-ID

Ich habe das Standard-{controller}/{action}/{id} Muster in meinem global.asax.

Ich brauche auch etwas mir etwas geben wie www.example.com/microsoft oder www.example.com/apple während Microsoft und Apple id in der Datenbank gespeichert sind. Die Verwendung des Standardmusters wäre: www.example.com/brands/detail/microsoft

eine Idee, wie das Muster sein sollte? Ich habe versucht: {id} und setzen Sie den Controller und Aktion auf brands und detail es funktioniert, um meinen Bedarf zu dienen, sondern alle anderen Muster ruiniert.

dank

+0

scheint nicht möglich, da Sie www.example.com/apple von www.example.com/login nicht unterscheiden können, ob zuerst eine Marken-ID und zweitens der Controller ist Name. Es sei denn, Sie schreiben Ihren eigenen benutzerdefinierten Routing-Provider und überprüfen, ob dieser Teil Marken- oder Controllername sein sollte.Aber das wäre in den meisten Fällen für einen Router zu kompliziert ... – xandy

Antwort

5

Ihre Routenbestellung ist wichtig. Erstellen Sie also eine erste Routendefinition, die alle verfügbaren Controller behandelt, und geben Sie dann eine an, die die restlichen Anfragen behandelt. Dort finden Sie die www.yousite.com/apple Art der Anfrage

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

// to handle personalize user url 
routes.MapRoute("user","{url}", new {controller="Home",action="Profile",url = "" }); 

nun eine neue Klasse FromValuesListContraint, die von IRouteConstraint

public class FromValuesListConstraint : IRouteConstraint 
{ 
    private string[] _values; 

    public FromValuesListConstraint(params string[] values) 
    { 
     this._values = values; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, 
    RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     // Get the value called "parameterName" from the 
     // RouteValueDictionary called "value" 

     string value = values[parameterName].ToString(); 

     // Return true is the list of allowed values contains 
     // this value. 

     for (int i = 0; i < _values.Length; i++) 
      if (SContains(_values[i], value, StringComparison.OrdinalIgnoreCase)) 
       return true; 

     return false; 
    }  

    public bool SContains(string source, string toCheck, StringComparison comp) 
    { 
     return source.IndexOf(toCheck, comp) >= 0; 
    } 
} 

Profile Aktionsmethode in Heim den Parameterwert lesen und erhalten Daten erben genannt erstellen Griff Haben Sie Ihre von Ihrem Datenbank. So

public ActionResult Profile(string url) 
{ 
    //url variable will have apple or microsoft . You may get data from db and return a view now. 
} 

, wenn eine Anfrage kommt, wird sie prüfen, ob es sich um eine Steuerung zur Verfügung steht (die Sie in die FromValuesListContraint Klasse Konstruktor übergeben in Ihrer ersten Route Definition), wenn vorhanden, dann wird es für das Routing gehen, sonst, es wird für die allgemeine (Standard) Route gehen, die als zweite Route erwähnt wird.

In diesem Beispiel sind Home, Account und OtherOnes meine verfügbaren Controller. Wenn Sie Ihrem Projekt einen neuen Controller hinzufügen, möchten Sie diesen zum Konstruktor des FromValuesListConstraint-Klassenkonstruktors hinzufügen.

Einfach gesagt es funktioniert wie Catching eine bestimmte Ausnahme und die allgemeine Ausnahme, wenn keine von ihnen gefangen werden! :) (nur ein Beispiel zu verstehen)

+0

bisher gefällt mir die Idee, werde ich versuchen, es umzusetzen. Danke – dritterweg

+0

es war gut..Ich implementierte meine Routing-URL wie diese neue {Controller = "Home", action = "Index", ID = ""} Ich kann URL wie: http: // localhost: 53045/Accounts/chjnvd780 . Haben Sie eine Idee, warum mein modelstate.isvalid den Fehler bekommen hat? Es wird angezeigt Der Wert 'chjnvd780' ist nicht für ID gültig. Haben Sie eine Idee, wie Sie das Problem lösen können? – Cherry

6

würde ich eine separate Strecke mit einer Einschränkung vorschlagen, dass die ID nicht einen Ihrer Controller entweder kann oder muss eine der IDs in der Datenbank übereinstimmen übereinstimmen. Listen Sie es vor der Standardroute auf, damit es zuerst übereinstimmt, wenn die Qualifikationen erfüllt sind.

Beispiel mit einer einfachen Regex für eine feste Einschränkung, obwohl Sie wahrscheinlich eine benutzerdefinierte Einschränkung erstellen möchten, die von IRouteConstraint abgeleitet wird und die Werte dynamisch begrenzt.

routes.MapRoute(
    "Brands", 
    "{id}", 
    new { controller = "brand", action = "detail" }, 
    new { id = "^(Microsoft)|(Apple)$" } 
); 

Sie könnten http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx für mehr Ideen suchen.