2008-10-24 15 views
22
Benutzername

Ich versuche, eine Route mit einem Benutzernamen zu erstellen ...ASP.Net MVC Strecke

So würde die URL mydomain.com/abrudtkhul sein (abrudtkhul der Benutzername ist)

wird

Meine Bewerbung haben öffentliche Profile basierend auf Benutzernamen (Bsp .: http://delicious.com/abrudtkuhl). Ich möchte dieses URL-Schema replizieren.

Wie kann ich das in ASP.Net MVC strukturieren? Ich verwende auch Mitgliedschafts-/Rollenanbieter.

Antwort

25

Hier ist, was Sie tun möchten, zuerst Ihre Routenkarte definieren:

routes.MapRoute(
      "Users", 
       "{username}", 
       new { controller = "User", action="index", username=""}); 

Was Sie ist Setup zu tun, erlaubt die folgende Konvention:

  • Controller: Benutzer (die Usercontroller-Typ)
  • Aktion: Index (dies den Index Methode der Usercontroller abgebildet wird)
  • Nickname: Dies ist der Parameter für die Methode Index

Also, wenn Sie fordern die URL http://mydomain.com/javier dies für UserController.Index (string username) auf den Aufruf übersetzt werden wo Benutzername auf den Wert von javier gesetzt .

Nun, da Sie über die Verwendung der MembershipProvider Klassen planen, möchten Sie etwas mehr wie folgt aus:

public ActionResult Index(MembershipUser usr) 
{ 
    ViewData["Welcome"] = "Viewing " + usr.UserName; 

    return View(); 
} 

Um dies zu tun, müssen Sie eine Modelbinder verwenden, um die Arbeit von zu tun, gut, Bindung von einem Benutzernamen zu einem MembershipUser-Typ. Dazu müssen Sie einen eigenen ModelBinder-Typ erstellen und auf den Benutzerparameter der Index-Methode anwenden. Ihre Klasse kann wie folgt aussehen:

public class UserBinder : IModelBinder 
{ 
    public ModelBinderResult BindModel(ModelBindingContext bindingContext) 
    { 
     var request = bindingContext.HttpContext.Request; 
     var username = request["username"]; 
     MembershipUser user = Membership.GetUser(username); 

     return new ModelBinderResult(user); 
    } 
} 

Auf diese Weise können Sie die Erklärung des Index-Methode ändern sein:

public ActionResult Index([ModelBinder(typeof(UserBinder))] 
    MembershipUser usr) 
{ 
    ViewData["Welcome"] = "Viewing " + usr.Username; 
    return View(); 
} 

Wie Sie sehen können, haben wir angelegte [Modelbinder (typeof (UserBinder))] Attribut zum Parameter der Methode. Das heißt, bevor Ihre Methode aufgerufen wird, wird die Logik Ihres UserBinder-Typs aufgerufen. Wenn die Methode aufgerufen wird, verfügen Sie über eine gültige Instanz Ihres MembershipUser-Typs.

+2

Dies wurde in neueren Versionen von MVC geändert, sollte jetzt sein: object BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) – Keith

+0

Ich erhalte null Benutzernamen in The Model Binder Warum? –

+0

@Keith Alles funktioniert gut, aber URL-Routing funktioniert nicht –

1

Sie könnten einen Weg haben, die wie folgt aussieht:

{username} 

mit den Vorgaben von

Controller = "Users" 

für das fertige Produkt aus:

routes.MapRoute(
        "Users", 
        "{username}", 
        new { controller = "Users" } 

Damit der Benutzername das ist Nur der URL-Parameter geht davon aus, dass der MVC ihn an den Benutzercontroller übergibt.

+0

Okay, ich hatte das ... aber es funktioniert nicht aus irgendeinem Grund. Was mache ich mit dem View? –

+0

Ich würde annehmen, sie würden alle die gleiche Ansicht haben. Ihre Ansicht kann beliebig aufgerufen werden, solange Sie die View (string) -Überladung aufrufen und das aspx der View im Unterverzeichnis Users unter Views ist. –

+0

Sie müssen auch die Aktion angeben. Ändern Sie den neuen Teil in: new {controller = "Users", action = "Show"} oder wie auch immer Sie es nennen wollen –

1

Versuchen Sie, es als Parameter an einen Controller zu übergeben?

Theoretisch Sie so etwas tun könnte:

routes.MapRoute ("name", "{user}/{Controller}/{Aktion}", neue {controller = "blah", action = „bla ", user =" "})

Ich bin nicht zu erfahren mit ASP.NET-Routing, aber ich denke, dass sollte arbeiten.

1
routes.MapRoute(
      "Users", 
       "{username}", 
       new { controller = "Users", action="ShowUser", username=""}); 

Ok, was wird dies tun, ist es, den Benutzernamen Parameter auf den Wert von {username} Standard

so, auch wenn Sie Benutzernamen geschrieben haben = „“ es wird wissen, den Wert zu übergeben { Benutzername} .. aufgrund der Zeichenfolgen übereinstimmen.

würde diese

für die URL Form erwarten

http://website.com/username

  • Benutzer Contoller
  • showuser Aktion (Methode im Regler)
  • Benutzernamen Parameter auf der showuser Aktion (Methode)
17

Sie sollten in Erwägung ziehen, Benutzernamen bestimmter Typen nicht zuzulassen, wenn Sie andere funktionale Controller wie Konto, Admin, Profil, Einstellungen usw. haben möchten. Außerdem möchten Sie möglicherweise, dass Ihr statischer Inhalt die Route "Benutzername" nicht auslöst . Um diese Art von Funktionalität (ähnlich wie twitter Urls verarbeitet werden) erreichen Sie die folgenden Routen verwenden:

// do not route the following 
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.IgnoreRoute("content/{*pathInfo}"); 
routes.IgnoreRoute("images/{*pathInfo}"); 

// route the following based on the controller constraints 
routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
    , new { controller = @"(admin|help|profile|settings)" } // Constraints 
); 

// this will catch the remaining allowed usernames 
routes.MapRoute(
    "Users", 
    "{username}", 
    new { controller = "Users", action = "View", username = "" } 
); 

Dann benötigen Sie einen Controller haben, für jedes der Token in der Constraint Zeichenfolge (zAdmin, Hilfe, Profil, Einstellungen), sowie einen Controller namens Benutzer und natürlich den Standard-Controller von Home in diesem Beispiel.

Wenn Sie viele Benutzernamen haben, die Sie nicht zulassen möchten, sollten Sie einen dynamischeren Ansatz in Betracht ziehen, indem Sie einen benutzerdefinierten Routen-Handler erstellen.

+0

Angeben von Einschränkungen ist der richtige Weg, es zu tun. Nichts anderes hat für mich funktioniert. Es wird weiter auf Standard-Routing ohne Einschränkungen gehen. Danke, dass du deine Lösung geteilt hast. –

+0

Ja, meins funktioniert auch beim Hinzufügen von Einschränkungen. Warum denkst du, dass das passiert? – avidProgrammer

+0

Wie erreiche ich dies mit asp.net Core? –